3
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

簡単すぎてエラーが発生しないと思いますが、それでもエラーが発生しますショックです

4

4 に答える 4

13

複数の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
| :}
于 2013-06-04T09:02:48.167 に答える
2

あなたはGHCiで働いていると思います。コードの問題は、1 つの関数でパターン マッチの 2 つのケースを定義しているのではなく、関数自体を再定義しているだけだということです。したがって、let countList (x:xs) = 1+countList xs部分が に置き換えられますがlet countList [] = 0、これは実際には網羅的なパターン マッチではありません。

于 2013-06-04T09:02:43.990 に答える
1

countListパターンガードを追加して既存の定義を拡張する代わりに、関数を再定義しています。GHCiで(式を使用する以外に)やりたいことを行う方法があるかどうかはわかりませんcase ... of ...

これも参照してください: GHCi "let" -- 何をしますか?

于 2013-06-04T09:03:25.253 に答える
0

let を使用する必要がありますか?
そうでない場合は、これが最も簡単です。

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

0 の条件は、ジェネリック条件の前にある必要があります。

于 2013-06-04T10:02:36.500 に答える