let countList (x:xs) = 1+countList xs
let countList [] = 0
countList [1,2,3]
*** Exception: <interactive>:35:5-20: Non-exhaustive patterns in function countList
我認爲這是太簡單了,得到一個錯誤,但錯誤仍然存在 我很震驚Haskell中,一個簡單的模式匹配得到錯誤
let countList (x:xs) = 1+countList xs
let countList [] = 0
countList [1,2,3]
*** Exception: <interactive>:35:5-20: Non-exhaustive patterns in function countList
我認爲這是太簡單了,得到一個錯誤,但錯誤仍然存在 我很震驚Haskell中,一個簡單的模式匹配得到錯誤
使用多個let
聲明意味着您確實定義了兩個函數,第二個定義映射第一個函數。因此,countList [1, 2, 3]
將引發異常,因爲範圍內的定義僅針對[]
定義。
您需要同時使用一個let
定義兩個方程。您可以在一行上輸入它們,用分號分隔的情況下
> let countList (x:xs) = 1 + countList xs; countList [] = 0
或使用GHCI的多語法:{ ... :}
,確保與第一個對準第二countList
。
> :{
| let countList (x:xs) = 1 + countList xs
| countList [] = 0
| :}
我不知道多行語法,謝謝.. – sinan
我猜你已經進入了ghci工作。你的代碼的問題在於你沒有在單個函數中定義兩種模式匹配的情況,但是你只是重新定義了函數本身。因此,您將let countList (x:xs) = 1+countList xs
部分替換爲let countList [] = 0
,這實際上是非窮舉的模式匹配。
你重新定義更多的警衛模式擴展現有的定義countList
函數。我不確定在GHCi中是否有辦法做你想做的事(除了使用case ... of ...
表達式)。
你有使用讓?
如果不是,這是最簡單的。
countList [] = 0
countList (x:xs) = 1 + countList xs
0的條件應該在通用條件之前。
你感到震驚?哎呀。 – Raptor
這是正確的,當我用case-of來匹配他們 – snow