首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么要使用null函数而不是== []来检查Haskell中的空列表?

为什么要使用null函数而不是== []来检查Haskell中的空列表?
EN

Stack Overflow用户
提问于 2019-07-15 00:36:35
回答 3查看 10.2K关注 0票数 64

我正在通读的“入门”章节。上面写着:

null检查列表是否为空。如果是,则返回True,,否则返回False.使用此函数而不是xs == [] (如果您有一个名为xs)的列表

我在ghci中尝试过:

代码语言:javascript
复制
xs = []      -- and then,

xs == []
null xs

它们都是True

我想知道有什么不同。

我应该使用null函数而不是== []函数吗?为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-15 00:38:25

您应该使用null。在大多数情况下,这都无关紧要,但不管怎样,这都是一个好习惯,因为有时您可能想要检查不可比较的内容列表是否为空。下面是一个简短、简洁的示例,展示了这一区别:

代码语言:javascript
复制
> null [id]
False
> [id] == []
<interactive>:1:1: error:
    • No instance for (Eq (a0 -> a0)) arising from a use of ‘==’
        (maybe you haven't applied a function to enough arguments?)
    • In the expression: [id] == []
      In an equation for ‘it’: it = [id] == []
票数 76
EN

Stack Overflow用户

发布于 2019-07-15 03:02:59

除了到目前为止给出的很好的答案之外,null实际上还有类型

代码语言:javascript
复制
null :: Foldable t => t a -> Bool

我不知道你是否已经了解了null中的类型类,但它的不足之处在于,null不仅可以用于列表,还可以用于任何实现LYAH的数据结构。

这就是说,在MapSet上使用null也是有效的。

代码语言:javascript
复制
> null Map.empty
True
> null (Map.singleton 1)
False
> null Set.empty
True
> null (Set.singleton 1)
False
> null []
True
> null [1]
False

我认为编写需要如此通用的函数并不是特别常见,但默认编写更通用的代码也没什么坏处。

附注

在许多情况下,您最终会希望使用像null这样的函数来对列表(或其他数据结构)执行条件行为。如果您已经知道您的输入是一个特定的数据结构,那么只对它的空case进行模式匹配会更优雅。

比较

代码语言:javascript
复制
myMap :: (a -> b) -> [a] -> [b]
myMap f xs
  | null xs = []
myMap f (x:xs) = f x : myMap f xs

代码语言:javascript
复制
myMap' :: (a -> b) -> [a] -> [b]
myMap' f [] = []
myMap' f (x:xs) = f x : myMap' f xs

通常,如果有意义,您应该尝试使用模式匹配。

票数 27
EN

Stack Overflow用户

发布于 2019-07-15 03:07:36

同样,一个过滤所有空列表的简单函数也会失败:

代码语言:javascript
复制
withoutEmpty = filter (== [])

那就是:

代码语言:javascript
复制
withoutEmpty = filter null

请注意:

代码语言:javascript
复制
withoutEmpty ls = filter (==[]) ls

将工作得很好,但重要的一点是,在某些情况下,例如另一个可能会失败。

还可以看看@cole answer,它补充了这里的所有答案,类型类Foldable在那里有要实现的null函数:

查看有关Foldable here的更多信息

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57029258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档