如何为两个列表或集合的联合编写函数式程序?
答案 0 :(得分:1)
这取决于语言,但通常会有一个递归解决方案,涉及遍历识别共享元素的集合。
E.g。在Haskell上的本地Data.Set
类型,
union :: Ord a => Set a -> Set a -> Set a
union Tip t2 = t2
union t1 Tip = t1
union t1 t2 = hedgeUnion (const LT) (const GT) t1 t2
hedgeUnion _ _ t1 Tip
= t1
hedgeUnion cmplo cmphi Tip (Bin _ x l r)
= join x (filterGt cmplo l) (filterLt cmphi r)
hedgeUnion cmplo cmphi (Bin _ x l r) t2
= join x (hedgeUnion cmplo cmpx l (trim cmplo cmpx t2))
(hedgeUnion cmpx cmphi r (trim cmpx cmphi t2))
where
cmpx y = compare x y
或者更简单地说,对于列表:
unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]
unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs
答案 1 :(得分:0)
这听起来像是一个家庭作业问题,但我会咬人。在Python中:
lambda x, y: x + filter(lambda z: z not in x, y)