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
簡単すぎてエラーが発生しないと思いますが、それでもエラーが発生しますショックです
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
簡単すぎてエラーが発生しないと思いますが、それでもエラーが発生しますショックです
複数のlet
ステートメントを使用するということは、実際には2 つの関数を定義していることを意味し、2 番目の定義は最初の定義を隠します。したがって、countList [1, 2, 3]
スコープ内の定義は に対してのみ定義されているため、 は例外をスローします[]
。
単一の で同時に両方の方程式を定義する必要がありますlet
。大文字と小文字をセミコロンで区切って、1 行に入力することもできます。
> let countList (x:xs) = 1 + countList xs; countList [] = 0
または、GHCi の複数行構文を使用して、2 番目の構文を最初:{ ... :}
の構文と一致させます。countList
> :{
| let countList (x:xs) = 1 + countList xs
| countList [] = 0
| :}
あなたはGHCiで働いていると思います。コードの問題は、1 つの関数でパターン マッチの 2 つのケースを定義しているのではなく、関数自体を再定義しているだけだということです。したがって、let countList (x:xs) = 1+countList xs
部分が に置き換えられますがlet countList [] = 0
、これは実際には網羅的なパターン マッチではありません。
countList
パターンガードを追加して既存の定義を拡張する代わりに、関数を再定義しています。GHCiで(式を使用する以外に)やりたいことを行う方法があるかどうかはわかりませんcase ... of ...
。
これも参照してください: GHCi "let" -- 何をしますか?
let を使用する必要がありますか?
そうでない場合は、これが最も簡単です。
countList [] = 0
countList (x:xs) = 1 + countList xs
0 の条件は、ジェネリック条件の前にある必要があります。