Functional programming 理解OCAML幂函数的困难
我试图理解这个Caml函数来计算一个数的n次方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。在
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
。在定义了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中的函数是可以传递给其他函数并作为函数结果返回的一级值。