2010-10-04 108 views
33

我剛剛開始學習Haskell出於興趣。我遵循learnyouahaskell.comnull而不是==

在那裏,我發現這一點:

null檢查列表是空的。如果它是 是,它返回True,否則它 返回False。使用此功能 代替xs == [](如果你有一個 列表稱爲xs

這是爲什麼?當兩者產生相同的結果時,爲什麼我們應該使用null而不是==

謝謝。

+0

優秀的問題BTW。這個想法還沒有超出我的想法。 (仍然學習Haskell) – 2010-10-04 11:15:31

回答

66

名單與==比較需要的元素(可表示爲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). 
10

在我看來,null myList自然比myList == []讀得更多。

但是的存在理由對於null是它可以作爲函數使用。例如,這裏有一個函數,它接受一個列表的列表,並且只返回非空的:

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

沒有null,這將是更加尷尬:

nonEmptyLists = filter ([] /=) 
+4

但是,'filter([]/=)'。 – kennytm 2010-10-04 09:22:55

+0

如何反轉操作數,並且更自然地做好準備:'filter(/ = [])'。請注意,我總是比較喜歡通過相等運算符進行模式匹配(除非在上面的例子中將它用作函數) – Dario 2010-10-04 09:35:21

+13

請參閱sdcvvc的回答:真正的原因是'null'對任何列表都有效,而'(== [ ])'只適用於'Eq'列表。 – 2010-10-04 10:02:05

6

另一個好處是用null是,許多其它容器(例如Data.Sequence,Data.ByteString,等)有null功能以及。這樣只需更改導入語句就可以輕鬆切換到其他實現。