标准前置函数中是否存在实现联合和集合的交集?
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]
答案 0 :(得分:14)
标准库中的列表中有union
和intersect
个函数,位于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/…)。