null而不是==

bdh*_*har 34 haskell coding-style operators typeclass

我刚刚开始学习Haskell的兴趣.我关注learnyouahaskell.com.

在那里我发现了这个:

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

这是为什么?我们为什么要使用null而不是==两者都产生相同的结果?

谢谢.

sdc*_*vvc 69

比较列表与==要求元素是可比较的(表示为Eq a).

Prelude> :t (==[])
(==[]) :: (Eq a) => [a] -> Bool
Run Code Online (Sandbox Code Playgroud)

例如,[sin] == []不起作用,因为你无法比较函数.它可能看起来很愚蠢,但类型系统必须在不查看其值的情况下判断表达式的类型.

另一种检查方法是length xs == 0,这不需要相等但如果您的列表是无限的则不会停止(尝试length [1..] == 0).这就是为什么有专门的功能.

null [] = True
null _ = False

Prelude> :t null
null :: [a] -> Bool     -- Notice lack of (Eq a).
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 11

在我看来,null myList阅读更自然myList == [].

存在的理由null是,它可以作为一个功能.例如,这是一个获取列表列表的函数,只返回非空列表:

nonemptyLists :: [[a]] -> [[a]]
nonemptyLists = filter (not . null)
Run Code Online (Sandbox Code Playgroud)

没有null,这会更尴尬:

nonEmptyLists = filter ([] /=)
Run Code Online (Sandbox Code Playgroud)

  • 请参阅sdcvvc的答案:真正的原因是`null`适用于任何列表,而`(== [])`仅适用于`Eq`列表. (13认同)
  • 但是,`filter([]/=)`. (4认同)

Joh*_*n L 6

使用的另一个好处null是许多其他容器(例如Data.Sequence,Data.ByteString等)也具有一个null功能.这样,只需更改import语句即可轻松切换到其他实现.