2011-05-13 2 views
9

유니온과 세트의 교차를 구현하는 표준 Prelude 함수가 있습니까?거기에 하스켈 Prelude 구현을 결합하고 교차합니까?

union  :: (Eq a) => [a] -> [a] -> [a] 
intersect :: (Eq a) => [a] -> [a] -> [a] 

이없는 경우, 내 구현 (게으름과 서곡 기능을 잘 활용) 목록에 unionintersect 기능은 표준 라이브러리에 있습니다

unionSet :: (Eq a) => [a] -> [a] -> [a] 
unionSet as bs = foldl (\xs y -> if elem y xs then xs else xs ++ [y]) as bs 

intersectSet :: (Eq a) => [a] -> [a] -> [a] 
intersectSet as bs = let ns = [ a | a <- as, elem a bs] in [ b | b <- bs, elem b ns] 

답변

14

, 효율적인 경우 말했다 수있는 사람 수 Data.List에 있지만 Prelude에는 없습니다.

효율성이 향상되는 한, 위와 모두에 대해 "아니오"라고 말할 것입니다. Eq 제약 조건이있는 목록에서 효율적으로 작업 할 수있는 방법은 없습니다. 즉, 당신은 여전히 ​​Data.List 유익한에서 구현을 찾을 수 있습니다 - 내가 관련 소스에 직접 지적한 위의 링크를 참조하십시오.

편집 - 후손을 위해서 간단한 부록으로, 오히려 이러한 기능에 존재 "의 좁은 질문보다, 당신이 실제로 는이 목적을 위해 사용 원하는 것을 위해 돈의 답변을 참조하십시오 모든".

14

기본 라이브러리는 camccann이 지적한대로 목록 버전을 제공합니다. 당신이 좀 더 효율적으로 일을하려는 경우, 제공하는, Data.Set을 고려

union :: Ord a => Set a -> Set a -> Set a 

intersection :: Ord a => Set a -> Set a -> Set a 

복잡성 O (N + m)와 함께.

+6

'Ord' 제약 조건과'Set '과 같은 숨겨진 표현이있는 데이터 구조는 합리적인 효율성을 가지면서 실제로 얻을 수있는 일반적인 것입니다. 거의 모든 것이 매우 비효율적이거나 저장하기에 더 제한적입니다. –

0

흔히 서명을 검색하여 필요한 것을 구현할 수 있습니다. Hoogle에 유형 서명을 드롭하면됩니다 ( haskell.org/hoogle/…).