1

jason の本を読んでいますが、次のプログラムがよくわかりません。

let fact2 i =
    let rec loop accum i =
        if i = 0 then 
            accum
        else
            loop (i * accum) (i - 1)
    in
        loop 1
  1. accum はどのように初期化されますか?
  2. 最後の 2 行 (つまり、ループ 1) の意味は何ですか? loop には 2 つのパラメーターがあります。ここで 1 つだけが渡される理由 (つまり、ループ 1)。

どうもありがとうございました!!!

4

3 に答える 3

4

実装ミスだと思います。最後の行は

ループ 1 i

整数 1は関数からaccum初期化し、同じ関数で初期化します。loopii

于 2013-09-27T16:43:18.297 に答える
3

で始まる行は関数let rec loop accum iを定義していることに注意してください。したがって、関数が呼び出されると初期化されます。これは最後の行で発生します。カカドゥが指摘しているように、あなたの投稿には転記エラーがあります。最後の行は、(本質的に) どちらが 1 に初期化されるかを示す必要があります。accumloop 1 iaccum

于 2013-09-27T16:45:01.367 に答える
1

最初の行に余分な「i」があると思います。これにより、fact2 は使用されない追加の引数を取ります。代わりに、次のように読む必要があります。

let fact2 =

「ループ 1」と書かれている最後の行は、部分適用と呼ばれることがよくあります。

Ocaml は通常、カリー化された関数を使用するため、別の考え方として、loop実際には 1 つのパラメーターを受け取り、別のパラメーターを受け取って int を返す関数を返すというものがあります。

この特定のケースでは、 の型は、(loop 1)を取り、を返すint -> intことを意味します。の型は、を受け取り、を返すことを意味します。は右結合であるため、より明示的に記述することもできます。intintloopint -> int -> intintint -> intint -> (int -> int)->

他の質問に答えるために、accumは に 1 を渡すことによって初期化されloopます。

カリー化の詳細については、http: //en.wikipedia.org/wiki/Curryingを参照してください。

そしてもちろん、他の人が示唆しているように別の「i」を追加することもできますが、他の人がそれを省略したときにまだ混乱するでしょう.

let f x y = ...と同等であると考えるのに役立つかもしれませんlet f = fun x -> fun y -> ...

もちろんlet f x = g xは と同じですがlet f = g、前者gは が関数の場合にのみ機能します。

于 2013-10-04T21:38:18.300 に答える