哈斯克爾擁有安全語言的聲譽。一般來說,一個可能的編程錯誤會導致編譯時錯誤,而且會減少運行時間。爲什麼在Haskell case語句中默認的catch-all不是強制的?
其中一個例子是if
表達式。 if中的else
始終是強制性的。你需要掩蓋兩種可能性。這很好,因爲你已經想到並且覆蓋了運行時會發生什麼的所有可能性。
Now Haskell has a case
expression。 (這與OO和命令式語言中的switch
語句有一些相似之處 - 但Haskell在類型系統中增加了很多豐富性)。
describeList :: [a]
describeList xs = "The list is " ++ case cs of [] -> "empty."
[x] -> "a singleton list."
xs -> "a longer list."
但是對於case
表達式,默認的「全部捕獲」不是強制性的。
對我來說,這聽起來像會導致運行時錯誤。
我的問題是:爲什麼在Haskell case
聲明中默認的捕獲全部不是必需的?
你可以寫'_ - >錯誤「永遠不會發生」,但這是默認行爲。重點是什麼? –
你最後的模式'xs - >「...」'**已經是一個全部捕獲 - 所以是問題*爲什麼*你不是被迫使用'_'或者它是爲什麼當你不匹配所有不是一個錯誤? – Carsten
要問的一個更好的問題可能是:*爲什麼Haskell中的模式匹配可能是非詳盡的?*因爲如果明確地涵蓋了所有的情況,那麼catch-all將是超級的,甚至是有害的。 – stholzm