2

階乗の末尾再帰バージョンを実装しようとしています。

let{factorial 0 n = n; factorial x n =  factorial (x-1, n * x)}

私はこれを手に入れます:

<interactive>:1:41:
Occurs check: cannot construct the infinite type: t1 = t1 -> t1
In the return type of a call of `factorial'
In the expression: factorial (x - 1, n * x)
In an equation for `factorial':
    factorial x n = factorial (x - 1, n * x)

<interactive>:1:52:
Occurs check: cannot construct the infinite type: t0 = (t0, t1)
In the first argument of `(-)', namely `x'
In the expression: x - 1
In the first argument of `factorial', namely `(x - 1, n * x)'

<interactive>:1:61:
Occurs check: cannot construct the infinite type: t1 = (t0, t1)
In the second argument of `(*)', namely `x'
In the expression: n * x
In the first argument of `factorial', namely `(x - 1, n * x)'

ここで無限型を作成するにはどうすればよいですか?(GHCi 7.0.1を使用)

4

1 に答える 1

7

私は強力な Haskell プログラマーではありませんが、書き直したいと思います。

factorial x n =  factorial (x-1, n * x)

なので

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

(x-1, n * x)ペアタイプなので、これはあなたが望むものではありません。

お役に立てれば!

于 2012-07-24T19:37:30.570 に答える