我正在嘗試使用不同的方法計算串列的長度(只是為了熟悉語言)。使用模式匹配的函式按預期作業,而使用守衛的函式會引發錯誤。
經過一番挖掘,我注意到這條線可能有問題(x : xs) == [] = res,但我無法弄清楚到底是什么。任何幫助將非常感激!
使用模式匹配(按預期作業)
myLength1 list = go list 0
where
go [] res = res
go (x : xs) res = go xs (res 1)
使用警衛(投擲Non-exhaustive patterns in function go)
myLength2 list = go list 0
where
go (x : xs) res
| (x : xs) == [] = res
| otherwise = go xs (res 1)
uj5u.com熱心網友回復:
經過一番挖掘,我注意到這條線可能有問題
(x:xs) == []
(x:xs) == []永遠不可能成功。隨著(x:xs)您構造一個包含至少一個元素的串列:x是第一個元素,并且xs是剩余元素的(可能為空的)串列,而[]是一個空串列。
如果這樣呼叫go [],它將無法進行模式匹配(x:xs),因為空串列的資料建構式是[],而“ cons ”的資料建構式是(:)。因此,這確實會引發非詳盡的模式錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411297.html
標籤:
