gpt4 book ai didi

functional-programming - OCaml 中嵌套 `let .. in ..` 的评估范围/顺序

转载 作者:行者123 更新时间:2023-12-01 07:05:13 24 4
gpt4 key购买 nike

我这里有一些我不是 100% 理解的小问题:
let x = 1 in let x = x+2 in let x = x+3 in x
我知道这个表达式的结果是6,但只是想确定这个表达式的计算顺序;哪个部分先计算?

最佳答案

您询问了表达式 let x=1 in let x=x+2 in ... 中的求值顺序.顺序是“从左到右”!当你有一个let a=b in let c=d in ...的链条时,求值顺序总是从左到右。

但是,在您的示例中,有一个令人困惑的部分:您使用了相同的变量名称 x , 在每个 let构造。这令人困惑,因为您随后会看到类似 let x=x+1 的内容。 ,这看起来你正在“重新定义” x或“更改 x 的值”。但是在 OCAML 中实际上没有发生“x”的“改变”!正如上面已经指出的,这里发生的事情是每次都会引入一个新变量,因此您的示例完全等效于

 let x = 1 in let y = x+2 in let z = y+3 in z;;

请注意,这里的评估顺序也是从左到右。 (在 let 构造的每个链中,它总是从左到右。)在您最初的问题中,您选择将所有这些新变量称为“x”而不是 x , y , 和 z .这让大多数人感到困惑。最好避免这种编码风格。

但是我们如何检查我们是否正确地重命名了变量?为什么“让 x=1 in let y=x+2”而不是“let x=1 in let x=y+2”?此 x=x+2生意相当困惑!那么对于 let x=aaa in bbb的评价还有另外一种理解方式.构造
  let x=aaa in bbb

可以始终被应用于 aaa 的以下闭包替换,
  (fun x -> bbb) aaa

一旦你以这种方式重写它,你可以很容易地看到两件事:首先,OCAML 不会在闭包内评估“bbb”,直到“aaa”被评估。 (出于这个原因,对 let x=aaa in bbb 的求值是先求值 aaa 然后是 bbb,即“从左到右”。)其次,变量“x”被限制在闭包,因此“x”在表达式“aaa”中不可见。出于这个原因,如果“aaa”包含一个名为“x”的变量,那么它之前必须已经定义了某个值,并且与闭包中的“x”无关。为清楚起见,最好使用不同的名称来调用此变量。

在你的例子中:
 let x=1 in let x=x+2 in let x=x+3 in x

被改写为
 (fun x -> let x=x+2 in let x=x+3 in x) 1

然后内部 let构造也被重写:
 (fun x -> (fun x -> let x=x+3 in x) x+2 ) 1
(fun x -> (fun x -> (fun x-> x) x+3) x+2 ) 1

现在让我们重命名每个函数内函数的参数,我们总是可以在不改变代码含义的情况下这样做:
 (fun x -> (fun y -> (fun z -> z) y+3) x+2 ) 1

这与
 let x=1 in let y=x+2 in let z=y+3 in z

通过这种方式,您可以验证您是否正确重命名了变量。

关于functional-programming - OCaml 中嵌套 `let .. in ..` 的评估范围/顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10182677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com