难以理解OCAML功能

问题描述

我试图利用这个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,即ni_times 1

我知道这是一个非常基本的功能,但是我刚开始使用函数式编程,所以我想对此加以理解。

解决方法

基本上,您是在问OCaml如何解析一系列并置的值。

此表达式:

f a b c

解释为对传递三个独立参数的函数f的调用。它不是这样解析的:

f a (b c)

它将向f传递2个参数。

因此,确实将三个参数传递给iterate。参数列表中没有子表达式,只有三个单独的参数。

为什么您不认为在调用n i_times之前将对子表达式iterate进行评估?原因(我怀疑)是因为您知道n不是函数。但是语言的解析并不取决于事物的类型。如果您写了(n i_times)(带括号),它将被解析为对函数n的调用。 (当然,这是一个错误。)