Functional programming 理解OCAML幂函数的困难

Functional programming 理解OCAML幂函数的困难,functional-programming,ocaml,Functional Programming,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\u时间位时遇到了困难 根据我的理解,i_times获取一个值a并返回a*i,whrei在调用时传递给power。在

我试图理解这个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\u时间
位时遇到了困难

根据我的理解,
i_times
获取一个值
a
并返回
a*i
,whre
i
在调用时传递给
power
。在定义了
i_次
的表达式中,后面紧跟着
1
,那么这是否意味着
i_次1
,加在一起计算为
1*i

在本例中,我无法看到3个参数是如何传递给
iterate
。为什么它不变成2,也就是
n
i_乘以1


我知道这是一个非常基本的函数,但我刚刚开始函数编程,我想弄清楚它的意义。

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

这句话:

f a b c
它被描述为对传递3个单独参数的函数
f
的调用。它不是这样解析的:

f a (b c)
将2个参数传递给f

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


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

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

这句话:

f a b c
它被描述为对传递3个单独参数的函数
f
的调用。它不是这样解析的:

f a (b c)
将2个参数传递给f

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


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

为什么你认为
i_次
应该应用于
1
,而不是
n
应该应用于
i_次1
的结果?如果它真的像你想的那样工作,你会如何将
i_times
作为一个参数传递给
iterate
,而不将它应用到下一个参数?公平的问题。杰弗里的假设是正确的:我没有假设你说的话,因为
n
不是函数。但你的最后一个问题让我反思了我最初假设的含义。现在它确实点击了。谢谢。为什么您认为
i_次
应该应用于
1
,而不是
n
应该应用于
i_次1
的结果?如果它真的像你想的那样工作,你会如何将
i_times
作为一个参数传递给
iterate
,而不将它应用到下一个参数?公平的问题。杰弗里的假设是正确的:我没有假设你说的话,因为
n
不是函数。但你的最后一个问题让我反思了我最初假设的含义。现在它确实点击了。谢谢。谢谢,这100%回答了我的问题。基本上,当我将I_次传递给迭代时,我会说,“这是一个函数,它取一个参数,然后返回该参数乘以常数I(虽然它本身不是一个常数,但它在I_次的范围内),”我当时没有传递任何计算值。是的,这就是它的工作原理。OCaml中的函数是一级值,可以传递给其他函数并作为函数结果返回。谢谢,这100%回答了我的问题。基本上,当我将I_次传递给迭代时,我会说,“这是一个函数,它取一个参数,然后返回该参数乘以常数I(虽然它本身不是一个常数,但它在I_次的范围内),”我当时没有传递任何计算值。是的,这就是它的工作原理。OCaml中的函数是可以传递给其他函数并作为函数结果返回的一级值。