null而不是==

时间:2010-10-04 09:13:40

标签: haskell coding-style operators typeclass

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

我找到了这个:

  

null检查列表是否为空。如果它   是,它返回True,否则返回   返回False。使用此功能   而不是xs == [](如果你有   列表名为xs

为什么?当两者产生相同的结果时,为什么我们应该使用null而不是==

感谢。

3 个答案:

答案 0 :(得分:68)

将列表与==进行比较,要求元素具有可比性(表示为Eq a)。

Prelude> :t (==[])
(==[]) :: (Eq a) => [a] -> Bool

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

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

null [] = True
null _ = False

Prelude> :t null
null :: [a] -> Bool     -- Notice lack of (Eq a).

答案 1 :(得分:11)

在我看来,null myListmyList == []更自然地阅读。

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

nonemptyLists :: [[a]] -> [[a]]
nonemptyLists = filter (not . null)

没有null,这会更尴尬:

nonEmptyLists = filter ([] /=)

答案 2 :(得分:6)

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