コメントに人が指摘しているように、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>
GHCIのファイル/外部に書き込むと、これは起こりますか?私には何も目立っていません。 – Carcigenicate
これはどこかで重複していますが、基本的に1つの 'fact'関数に対して2つのケースを提供していません。 GHCi 8では関数定義から 'let'を削除できるようになりました。実際に引数に定義されている関数を1つ定義し、0にのみ定義された関数に置き換えました。 – chepner
これまでのバージョンでは間違いないでしょうのGHCi; 'let'なしの代入はエラーとなり、' let fact n = ... 'の後ろに' let fact 0 = 1'を同じ定義の一部として間違えることはないでしょう。 – chepner