我刚刚开始学习Haskell的兴趣。我关注learnyouahaskell.com。
我找到了这个:
null
检查列表是否为空。如果它 是,它返回True
,否则返回 返回False
。使用此功能 而不是xs == []
(如果你有 列表名为xs
)
为什么?当两者产生相同的结果时,为什么我们应该使用null
而不是==
?
感谢。
答案 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 myList
比myList == []
更自然地阅读。
但null
的存在理由是它可以用作函数。例如,这是一个获取列表列表的函数,只返回非空的列表:
nonemptyLists :: [[a]] -> [[a]]
nonemptyLists = filter (not . null)
没有null
,这会更尴尬:
nonEmptyLists = filter ([] /=)
答案 2 :(得分:6)
使用null
的另一个好处是许多其他容器(例如Data.Sequence,Data.ByteString等)也具有null
功能。这样,只需更改import语句即可轻松切换到其他实现。