问题描述
我试图利用这个Caml函数来计算数字的n次幂。
let rec iterate n f d =
if n = 0 then d
else iterate (n-1) f (f d)
let power i n =
let i_times a = a * i in
iterate n i_times 1
我了解它在概念上的作用,但在理解i_times
位方面遇到困难。
据我了解,i_times
取值a
并返回a*i
,而i
在调用时传递到power
上。在定义了i_times
的表达式中,其后是1
,这不是意味着i_times 1
一起被求值为1*i
吗?
在这种情况下,我看不到如何将3个参数传递给iterate
。为什么它最终不等于2,即n
和i_times 1
?
我知道这是一个非常基本的功能,但是我刚开始使用函数式编程,所以我想对此加以理解。
解决方法
基本上,您是在问OCaml如何解析一系列并置的值。
此表达式:
f a b c
将解释为对传递三个独立参数的函数f
的调用。它不是这样解析的:
f a (b c)
它将向f传递2个参数。
因此,确实将三个参数传递给iterate
。参数列表中没有子表达式,只有三个单独的参数。
为什么您不认为在调用n i_times
之前将对子表达式iterate
进行评估?原因(我怀疑)是因为您知道n
不是函数。但是语言的解析并不取决于事物的类型。如果您写了(n i_times)
(带括号),它将被解析为对函数n
的调用。 (当然,这是一个错误。)