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