2013-06-04 24 views
2
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中,一個簡單的模式匹配得到錯誤

+0

你感到震驚?哎呀。 – Raptor

+0

這是正確的,當我用case-of來匹配他們 – snow

回答

12

使用多個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 
| :} 
+0

我不知道多行語法,謝謝.. – sinan

2

我猜你已經進入了ghci工作。你的代碼的問題在於你沒有在單個函數中定義兩種模式匹配的情況,但是你只是重新定義了函數本身。因此,您將let countList (x:xs) = 1+countList xs部分替換爲let countList [] = 0,這實際上是非窮舉的模式匹配。

1

你重新定義更多的警衛模式擴展現有的定義countList函數。我不確定在GHCi中是否有辦法做你想做的事(除了使用case ... of ...表達式)。

參見本:GHCi "let" -- what does it do?

0

你有使用讓?
如果不是,這是最簡單的。

countList [] = 0 
countList (x:xs) = 1 + countList xs 

0的條件應該在通用條件之前。