没有显式递归的两个列表的并集和相交

时间:2019-03-03 20:21:14

标签: list haskell

我有两个应该在两个列表上使用的功能。

unionB :: Eq a => [a] -> [a] -> [a] 

intersectB :: Eq a =>  [a] -> [a] -> [a]

对于unionB,我有以下代码将两个列表的并集合并在一起,而无需使用显式递归。

 unionB :: Eq a => [a] -> [a] -> [a]
 unionB xs ys = [xs] ++ [[y] | y <- ys]

对于intersectB,我有以下代码将采用两个列表的交集(取最小计数)。唯一的问题是我正在使用显式递归来执行此操作。代码如下:

intersectB :: Eq a => [a] -> [a] -> [a]
intersectB (x:xs) list
     | x `elem` list = x : intersectB xs list
     | otherwise = intersectB xs list

是否可以使用intersectB函数的结构,除非不使用显式递归? (即在正文中没有提及intersectB吗?)

根据我的理解,intersectB应该与unionB相反。我假设intersectB看起来和unionB看起来非常相似。

我不能使用任何进口商品。我知道那里已经有导入了。

谢谢。

1 个答案:

答案 0 :(得分:3)

您的第一个功能应该是

 unionB :: Eq a => [a] -> [a] -> [a]                                     
 unionB xs ys = xs ++ [y | y <- ys, not (elem y xs)]

第二个类似的形式

 intersectB :: Eq a => [a] -> [a] -> [a]                                     
 intersectB xs ys = [y | y <- ys, elem y xs]

这假设Bag a[a]相同。