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