9

私は Haskell を学んでいますが、このチュートリアルの基本的な階乗関数に問題があります。

基本的に、階乗を次のように定義しました。

Prelude> let factorial 0 = 1
Prelude> let factorial n = n * factorial (n - 1)

タイプはチェックアウトします:

Prelude> :t factorial
factorial :: Num a => a -> a

これは理にかなっています。ただし、この関数の動作はそうではありません。(interactive): out of memory入力が何であれ、それは結果になります。

Prelude> factorial 5
(interactive): out of memory

これは、メモリ不足エラーにつながる無限再帰呼び出しであると想定する必要がありますが、何が原因であるかはわかりません。factorial 0これを 1 と明示的に宣言したにもかかわらず、同じことが で発生します。

Prelude> factorial 0
(interactive): out of memory

ここで奇妙な部分があります。階乗関数をファイルで定義すると、正常に機能します。tesths.hsファイルstを作成します。

factorial 0 = 1
factorial n = n * factorial (n - 1)

その後、GHCI に戻って を実行すると:l tesths.hs、エラーなく実行factorial 5できます。

何が起きてる?

4

3 に答える 3

16

2 つのケースを持つ 1 つの関数ではなく、2 つの関数が定義されました。最初に実行したのと同じコマンドを試すと:set -Wall、名前のシャドウイングの警告が表示されるはずです。問題を解決するには、試してください

let factorial 0 = 1; factorial n = n * factorial (n - 1)

代わりは。

于 2013-04-12T18:30:04.580 に答える
4

このかなりのワンライナーもあることに注意してください。

let factorial n = product [1..n]
于 2013-04-12T19:48:21.857 に答える