如何找到 Haskell 中两个列表的交集?
How do I find the intersection of two lists in Haskell?
我在 Haskell 中使用两个列表作为“集合”,我应该找到 return 两个列表的交集。我有措施从列表中删除重复项,但是我想不出如何实际比较列表并获得另一个仅包含两个列表中都存在的元素的列表。这是我目前所拥有的
intersect :: [Integer] -> [Integer] -> [Integer]
intersect [] _ = []
intersect _ [] = []
intersect (x:xs) L2 = filter (\x -> x 'elem' L2) L2
然而,这是不正确的,但从逻辑上讲,我无法确切地想到如何使它起作用。任何想法和建议将不胜感激!另外,如果有人有任何不涉及导入任何其他模块的想法会更好,因为我只想依赖前奏中的函数。
您应该使用反向符号将函数用作中缀运算符,因此 x `elem` L2
。此外,您在这里使用 L2
两次(因为 L2
以大写字母开头,编译器会认为 L2
是数据构造函数)。您应该使用另一个列表的项目过滤一个列表。 Integer
是一种类型,因此以大写字符开头。
如果我们这样解决上面的问题,我们得到:
intersect :: [Integer] -> [<strong>Integer</strong>] -> [Integer]
intersect [] _ = []
intersect _ [] = []
intersect xs <strong>ys</strong> = filter (\x -> <strong>x `elem` xs</strong>) ys
或更短:
intersect :: [Integer] -> [Integer] -> [Integer]
intersect [] = const []
intersect xs = filter <strong>(`elem` xs)</strong>
然而,如果 xs
是一个无限列表并且至少有一项 ys
最终没有为xs
列表。可以使用 diagonalization 最终产生出现在两个列表中的所有项目。可以为此使用 control-monad-omega
package。
我在 Haskell 中使用两个列表作为“集合”,我应该找到 return 两个列表的交集。我有措施从列表中删除重复项,但是我想不出如何实际比较列表并获得另一个仅包含两个列表中都存在的元素的列表。这是我目前所拥有的
intersect :: [Integer] -> [Integer] -> [Integer]
intersect [] _ = []
intersect _ [] = []
intersect (x:xs) L2 = filter (\x -> x 'elem' L2) L2
然而,这是不正确的,但从逻辑上讲,我无法确切地想到如何使它起作用。任何想法和建议将不胜感激!另外,如果有人有任何不涉及导入任何其他模块的想法会更好,因为我只想依赖前奏中的函数。
您应该使用反向符号将函数用作中缀运算符,因此 x `elem` L2
。此外,您在这里使用 L2
两次(因为 L2
以大写字母开头,编译器会认为 L2
是数据构造函数)。您应该使用另一个列表的项目过滤一个列表。 Integer
是一种类型,因此以大写字符开头。
如果我们这样解决上面的问题,我们得到:
intersect :: [Integer] -> [<strong>Integer</strong>] -> [Integer]
intersect [] _ = []
intersect _ [] = []
intersect xs <strong>ys</strong> = filter (\x -> <strong>x `elem` xs</strong>) ys
或更短:
intersect :: [Integer] -> [Integer] -> [Integer]
intersect [] = const []
intersect xs = filter <strong>(`elem` xs)</strong>
然而,如果 xs
是一个无限列表并且至少有一项 ys
最终没有为xs
列表。可以使用 diagonalization 最终产生出现在两个列表中的所有项目。可以为此使用 control-monad-omega
package。