2015-10-14 46 views
2

我有以下功能:非詳盡模式IF-THEN-ELSE

myMaximum [] = error "There is no such thing as 'maximum' in an empty list." 
myMaximum [x] = x 
myMaximum (x:xs) = if x >= tailMax 
        then x 
        else tailMax 
       where tailMax = myMaximum xs 

當我運行myMaximum [1..5]我工作得很好,但將在第一行規定,當我運行myMaximum [5..1]錯誤。如果我把第一行寫出來,它會抱怨在myMaximum上有一個非窮盡的模式。但爲什麼這種模式不完全?如何調用它[1..5]工作得很好,[5..1]顯然會導致空列表參數爲myMaximum

+0

只是一件事,你應該改變你的錯誤信息爲''[name]:[cause]「'的標準形式,所以這應該是'error'myMaximum:空列表'' – AJFarmar

+0

@AJFarmar感謝提示! – Metalcoder

回答

10

這不是關於你的功能。這是關於範圍表示法。在ghci中輸入[5..1],你會發現你得到一個空的列表。

除非您使用[first,second..last]符號明確更改,否則Haskell範圍表示法默認在每個步驟中添加一個。使用[5,4..1]來獲得您要查找的行爲。

如果您刪除了函數的第一個版本,則該模式並非詳盡無遺,因爲您的函數版本無法匹配空列表。