22

私は Haskell を学んでいます。これで階乗関数が生成されると思いました...

(ghci内)

Prelude> let ft 0 = 1
Prelude> let ft n = n * ft (n - 1)
Prelude> ft 5

(^C まで無期限にハングします)。

誰かが私を正しい方向に向けることができますか?

ありがとう!

4

1 に答える 1

32

2 つの別個のletステートメントは、互いに独立して解釈されます。最初に関数ft 0 = 1が定義され、次に新しい関数ft n = n * ft (n - 1)が定義され、最初の定義が上書きされます。

2 つのケースを持つ 1 つの関数を定義するには、両方のケースを 1 つのletステートメントに入れる必要があります。これを GHCI プロンプトで 1 行で行うには、次のように 2 つのケースを分けることができます;

Prelude> let ft 0 = 1; ft n = n * ft (n - 1)
Prelude> ft 5
120
于 2010-05-25T01:11:11.827 に答える