我剛剛開始學習Haskell出於興趣。我遵循learnyouahaskell.com。null而不是==
在那裏,我發現這一點:
null
檢查列表是空的。如果它是 是,它返回True
,否則它 返回False
。使用此功能 代替xs == []
(如果你有一個 列表稱爲xs
)
這是爲什麼?當兩者產生相同的結果時,爲什麼我們應該使用null
而不是==
?
謝謝。
我剛剛開始學習Haskell出於興趣。我遵循learnyouahaskell.com。null而不是==
在那裏,我發現這一點:
null
檢查列表是空的。如果它是 是,它返回True
,否則它 返回False
。使用此功能 代替xs == []
(如果你有一個 列表稱爲xs
)
這是爲什麼?當兩者產生相同的結果時,爲什麼我們應該使用null
而不是==
?
謝謝。
名單與==
比較需要的元素(可表示爲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).
在我看來,null myList
自然比myList == []
讀得更多。
但是的存在理由對於null
是它可以作爲函數使用。例如,這裏有一個函數,它接受一個列表的列表,並且只返回非空的:
nonemptyLists :: [[a]] -> [[a]]
nonemptyLists = filter (not . null)
沒有null
,這將是更加尷尬:
nonEmptyLists = filter ([] /=)
另一個好處是用null
是,許多其它容器(例如Data.Sequence,Data.ByteString,等)有null
功能以及。這樣只需更改導入語句就可以輕鬆切換到其他實現。
優秀的問題BTW。這個想法還沒有超出我的想法。 (仍然學習Haskell) – 2010-10-04 11:15:31