SML 中绑定的价值?

Value of bindings in SML?

有人可以解释一下为什么 "ans" 在评估后绑定到 16 的值 - 这是正确的答案吗?

我认为答案是 3,因为我们正在调用函数 f 并发送值 1 和 2,因为函数 f 也看不到值 5 和 10,但我想我错了。

val x = 1

val y = 2

val f = fn y => x + y

val x = 5

val y = 10

val ans = f x + y

我想我明白了。这里是:

函数 f 直到最后才被计算。所以在:

val ans = f x + y

... 调用函数 f 时使用最近的值 x,即 5,因为前一个 x 的值被隐藏了。所以在:

val f = fn y => x + y

...收到的值成为y的值。这里函数 f 取前一个 x 的值,即 1,因此总共 6x 来自静态环境)。那么:

val ans = f x + y

我们回到这里:6 + 10 = 16

您看到的有时称为词法范围。函数 f 是在 x 的某个绑定范围内定义的,该范围是理解调用 ff 做什么的唯一重要范围。 x 在调用 f 的范围内具有不同含义这一事实不会影响 f 本身的含义。在函数式编程的上下文中,任何其他内容都会违反 referential transparency。在一个绑定的范围内如

val x = 1

应该可以用1自由替换x。因此,您对 f 的定义应该 等同于 定义:

def f y = 1 + y

确实如此。