2016-12-01 9 views
1

私はGHCiの中に再帰階乗関数を実装しようとしましたが、私は次のエラー受けています:これはから来ているハスケル:階乗関数で非網羅的なパターン

Prelude> fact n = n * fact (n-1) 
Prelude> fact 0 = 1 
Prelude> fact 1 
*** Exception: <interactive>:2:1-10: Non-exhaustive patterns in function fact 

を、そしてどのようにすることができます将来このミスを避ける?

+0

GHCIのファイル/外部に書き込むと、これは起こりますか?私には何も目立っていません。 – Carcigenicate

+5

これはどこかで重複していますが、基本的に1つの 'fact'関数に対して2つのケースを提供していません。 GHCi 8では関数定義から 'let'を削除できるようになりました。実際に引数に定義されている関数を1つ定義し、0にのみ定義された関数に置き換えました。 – chepner

+3

これまでのバージョンでは間違いないでしょうのGHCi; 'let'なしの代入はエラーとなり、' let fact n = ... 'の後ろに' let fact 0 = 1'を同じ定義の一部として間違えることはないでしょう。 – chepner

答えて

6

コメントに人が指摘しているように、GHCi 8の1行の定義は以前の定義を置き換えます。マルチパターン定義を入力する場合は、マルチラインコマンドを開始および終了するには、特殊な:{および:}コードを使用する必要があります。だから、次は正常に動作します:

Prelude> :{ 
Prelude| fact 0 = 1 
Prelude| fact n = n * fact (n-1) 
Prelude| :} 
Prelude> fact 10 
3628800 
Prelude> 

また

、あなたの定義での順序を気にし(これはのみではなく、7 GHCiの8にも適用可能であることに注意してください)。あなたが fact n最初に一致するように試みるので、もしあなたの fact 0パターンが使用されることはありませんので、ハスケル、パターンの順序が重要では、それは常に..

編集にマッチします:GHCiの7のために、あなたがlet構文を使用する必要があります

Prelude> :{ 
Prelude| let fact 0 = 1 
Prelude|  fact n = n * fact (n-1) 
Prelude| :} 
Prelude> fact 10 
3628800 
Prelude> 
+0

複数行の構文は同じです。改良点は定義がもはや 'let'を必要とせず、複数行の定義に対して特に不快であったことです。 – dfeuer

関連する問題