我认为你在第一行有一个额外的“i”。这使得 fact2 需要一个从未使用过的额外参数。相反,它应该是:
let fact2 =
最后一行写着“循环 1”通常称为部分应用程序。
Ocaml 通常使用 curried 函数,因此另一种思考方式是loop实际上接受一个参数并返回一个函数,该函数又接受另一个参数并返回一个 int。
在这种特殊情况下,类型的(loop 1)意思int -> int是它接受一个int并返回一个int。的类型意味着它需要一个loop并返回一个。它也可以写得更明确,因为它是右结合的。int -> 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 = gg