为啥这个 SML 代码评估为 7 而不是 6?

Posted

技术标签:

【中文标题】为啥这个 SML 代码评估为 7 而不是 6?【英文标题】:Why doe this SML code evaluate to 7 and not 6?为什么这个 SML 代码评估为 7 而不是 6? 【发布时间】:2022-01-22 15:58:18 【问题描述】:

我已看到此 SML 代码作为内部绑定遮蔽外部绑定的示例。

let val x = 1
in
  (let val x=2 in x+1 end) + (let val y = x+2 in y+1 end)
end

在示例之后,作者写道,上面的代码计算结果为“7”,当我运行它时,我得到了相同的结果:

: val it = 7 : int

我不明白为什么。如果 x “遮蔽”了外部绑定,那么在最初的 let 中,它应该是 2,对吗?所以函数应该是:

2 + 1 
3
3 + 2 (x = 3, y = x + 2, so y = 3 + 2 = 5) 
5
5 + 1 (y = 5, 5 + 1 = 6)
6

即使我误解了阴影的工作原理,最终结果也应该是 5,而不是 6,而不是 7。那么这里发生了什么?

【问题讨论】:

【参考方案1】:

正如有时发生的那样,写下问题最终会得到答案。

该块应按如下方式评估:

x = 2
x + 1
2 + 1
result: 3
result: 3 + ( y + 1), y = (x + 2) where x=1 (from above)
 3 + ( 1 + 2) + 1
 7

【讨论】:

归根结底,关键是范围。

以上是关于为啥这个 SML 代码评估为 7 而不是 6?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的程序从右到左评估参数?

为啥在 Let while 循环里面不起作用 SML

为啥这个 VBA 代码给出 -25 而不是 25?

为啥 (inf + 0j)*1 评估为 inf + nanj?

如何在 SML 中打印 if 语句

为啥空的 JavaScript 数组在条件结构中评估为真?