繁体   English   中英

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

[英]Union and Intersection of Two Lists Without Explicit Recursion

我有两个功能应该在两个列表上工作。

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看起来非常相似。

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

谢谢。

您的第一个功能应该是

 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]相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM