最初の行に余分な「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は が関数の場合にのみ機能します。