如何使用Haskell检查列表是否为空

时间:2019-03-07 22:25:11

标签: list haskell functional-programming set-intersection

以下是我的代码尝试,用于尝试创建然后检查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.

3 个答案:

答案 0 :(得分:4)

您基本上已经有了正确的主意,这里只有一些小问题:

  • 您还没有关闭列表理解的括号,这会导致解析错误。
  • 列表不能直接与if一起使用,因为if仅适用于类型Bool的值。您可能会想到其他一些语言,其中且仅当列表/数组为非空时才将列表/数组视为“真”-但Haskell不会自动进行类型转换,因此您必须明确检查列表是否为非空。最好,最简单的方法是使用null函数(该函数将获取一个列表,如果为空,则返回True,否则返回False)。
  • 正如@Bergi所指出的(我最初是想念的),您在(Eq a)约束中遇到了错字。
  • if语句向后。 Python具有结构x if (condition) else y,但是Haskell却使用if condition then x else y。此外,尽管这没错,但是当您的xy分别为TrueFalse时,则不需要这样做,因为整个结果仅是{{ 1}}是。

因此代码应为:

(condition)

答案 1 :(得分:4)

问题

您的代码将无法编译,因为列表不能为布尔值,因此您不能将其包含在if语句中。但是,有allanynull之类的函数可以获取列表并返回布尔值。

解决方案

只需使用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