我正在阅读杰森的这本书,并且不太了解以下程序:
let fact2 i =
let rec loop accum i =
if i = 0 then
accum
else
loop (i * accum) (i - 1)
in
loop 1
非常感谢!!!
答案 0 :(得分:4)
我认为这是实施中的错误。最后一行应该是
循环1 i
整数1从accum
函数初始化loop
,i
在同一函数中初始化i
。
答案 1 :(得分:3)
请注意,以let rec loop accum i
开头的行定义了函数。因此,在调用函数时初始化accum
。这发生在最后一行。正如Kakadu指出的那样,你的帖子中有一个转录错误。最后一行应该说loop 1 i
(实质上)将accum
初始化为1。
答案 2 :(得分:1)
我认为你在第一行有一个额外的“我”。这使得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
传递给loop
进行初始化。
以下是有关currying的更多信息:http://en.wikipedia.org/wiki/Currying
当然,正如其他人所暗示的那样添加另一个“我”也会起作用,但是当其他人将其删除时,你仍会感到困惑。
将let f x y = ...
视为等同于let f = fun x -> fun y -> ...
当然let f x = g x
与let f = g
相同,但前者仅在g
为函数时才有效。