我有两个应该在两个列表上使用的功能。
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
看起来非常相似。
我不能使用任何进口商品。我知道那里已经有导入了。
谢谢。
答案 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]
相同。