以下是我的代码尝试,用于尝试创建然后检查Haskell中两个列表的交集。有人可以帮我让它运行吗?
gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
答案 0 :(得分:4)
您基本上已经有了正确的主意,这里只有一些小问题:
if
一起使用,因为if
仅适用于类型Bool
的值。您可能会想到其他一些语言,其中且仅当列表/数组为非空时才将列表/数组视为“真”-但Haskell不会自动进行类型转换,因此您必须明确检查列表是否为非空。最好,最简单的方法是使用null
函数(该函数将获取一个列表,如果为空,则返回True
,否则返回False
)。(Eq a)
约束中遇到了错字。if
语句向后。 Python具有结构x if (condition) else y
,但是Haskell却使用if condition then x else y
。此外,尽管这没错,但是当您的x
和y
分别为True
和False
时,则不需要这样做,因为整个结果仅是{{ 1}}是。因此代码应为:
(condition)
答案 1 :(得分:4)
您的代码将无法编译,因为列表不能为布尔值,因此您不能将其包含在if语句中。但是,有all
,any
和null
之类的函数可以获取列表并返回布尔值。
只需使用Prelude函数null :: [a] -> Bool
,如果您的列表为空,则返回true。 (还请注意,@ Bergi说您的类型约束中有错字)
empty_intersection :: (Eq a => [a] -> [a] -> Bool
empty_intersection as bs = null [x | x <- as, x `elem` bs]
另外,由于这是关于集并集和交集的第二个问题,请注意,有一个库Data.Set
用于处理有序集,该库具有更高效的交集,并集,隶属关系,差等功能。 / p>
答案 2 :(得分:0)
您可以使用intersect
empty_intersection :: (Eq a) => [a] -> [a] -> Bool
empty_intersection = null . intersect