难以理解 OCAML 幂函数
Trouble understanding OCAML power function
我正在尝试理解这个 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
和 returns a*i
,其中 i
在调用时传递给 power
它。在定义了 i_times
的表达式中,它后面跟着 1
,所以这是否意味着 i_times 1
一起计算为 1*i
?
在这种情况下,我看不出 3 个参数是如何传递给 iterate
的。为什么它最终不只是 2,即 n
和 i_times 1
?
我知道这是一个非常基本的函数,但我才刚刚开始使用函数式编程,我想理解它。
基本上你问的是 OCaml 如何解析一系列并列值。
这个表达式:
f a b c
被解释为对传递 3 个单独参数的函数 f
的调用。它不是这样解析的:
f a (b c)
这会将 2 个参数传递给 f。
所以确实,三个参数被传递给 iterate
。参数列表中没有子表达式,只有三个单独的参数。
为什么你没有想到在调用 iterate
之前会计算子表达式 n i_times
?原因(我怀疑)是您知道 n
不是函数。但是语言的解析不依赖于事物的类型。如果您编写 (n i_times)
(带括号),它将被解析为对 n
的函数调用。 (当然,这会是一个错误。)
我正在尝试理解这个 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
和 returns a*i
,其中 i
在调用时传递给 power
它。在定义了 i_times
的表达式中,它后面跟着 1
,所以这是否意味着 i_times 1
一起计算为 1*i
?
在这种情况下,我看不出 3 个参数是如何传递给 iterate
的。为什么它最终不只是 2,即 n
和 i_times 1
?
我知道这是一个非常基本的函数,但我才刚刚开始使用函数式编程,我想理解它。
基本上你问的是 OCaml 如何解析一系列并列值。
这个表达式:
f a b c
被解释为对传递 3 个单独参数的函数 f
的调用。它不是这样解析的:
f a (b c)
这会将 2 个参数传递给 f。
所以确实,三个参数被传递给 iterate
。参数列表中没有子表达式,只有三个单独的参数。
为什么你没有想到在调用 iterate
之前会计算子表达式 n i_times
?原因(我怀疑)是您知道 n
不是函数。但是语言的解析不依赖于事物的类型。如果您编写 (n i_times)
(带括号),它将被解析为对 n
的函数调用。 (当然,这会是一个错误。)