是否存在联合并与Haskell Prelude实现相交?

时间:2011-05-13 03:11:51

标签: data-structures haskell set

标准前置函数中是否存在实现联合和集合的交集?

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

如果不是,有人可以说我的实施是否有效,(充分利用懒惰和前奏功能)

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]

3 个答案:

答案 0 :(得分:14)

标准库中的列表中有unionintersect个函数,位于Data.List但不在Prelude本身。

就效率而言,我会对上述所有内容说“不”,无论是你的还是标准库。在仅具有Eq约束的列表上,实际上无法进行有效操作。也就是说,您仍然可以在Data.List内找到实施信息 - 请参阅上面的链接,我已直接指向相关来源。

编辑 - 作为后代的简要附录,请务必看到Don对您实际需要用于此目的的答案,而不是更简洁的问题“完全存在这些功能”。

答案 1 :(得分: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)

答案 2 :(得分:0)

您经常会通过搜索签名找到所需内容的实现。只需在Hoogle中删除您的类型签名( haskell.org/hoogle/…)。