为什么此 SML 代码的计算结果为 7 而不是 6?

Why doe this SML code evaluate to 7 and not 6?

有人向我展示了此 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。所以这里发生了什么?

有时会发生这样的情况,写下问题最终会得到答案。

块应该被评估如下:

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