在sml中,关于范围的问题是不明确的

在sml中,关于范围的问题是不明确的,sml,smlnj,Sml,Smlnj,为什么ans的值是9? 在f中,我认为x值被记为2,因为在f(z,w)中,valx是声明的,而x不是声明的 我说得对吗?你对这个问题的措辞表明你是从变量的角度来思考的。SML并不像Java这样的语言那样有变量。它具有可以命名的值。在val x=2中,值2绑定到名称x。在这一点上,x和2之间没有真正的区别。这是因为SML是一种函数式语言,它强制在任何表达式中变量可以被其值替换,而不改变表达式的含义。因此 val x = 2 fun f (z,w) = x + z + w val z = 3 val

为什么ans的值是9? 在f中,我认为x值被记为2,因为在f(z,w)中,valx是声明的,而x不是声明的
我说得对吗?

你对这个问题的措辞表明你是从变量的角度来思考的。SML并不像Java这样的语言那样有变量。它具有可以命名的值。在
val x=2
中,值
2
绑定到名称
x
。在这一点上,
x
2
之间没有真正的区别。这是因为SML是一种函数式语言,它强制在任何表达式中变量可以被其值替换,而不改变表达式的含义。因此

val x = 2
fun f (z,w) = x + z + w
val z = 3
val x = 4
val ans = f(z,x)
x
可以替换为
2
,而无需更改表达式的含义。因此,这一定义相当于

fun f (z,w) = x + z + w
稍后,您的代码将创建一个新值4,并(在法律上,尽管有些不一致)将该新值命名为
x
。这将创建一个全新的绑定。您没有更改
x
——您销毁了旧的
x
,并创建了一个新的
x
。这个新的
x
是在最终函数调用中使用的。
x,z
的值分别位于代码
4,3
中的该点,因此具有参考透明度

fun f (z,w) = 2 + z + w

我想说是暗影而不是毁灭,因为
f
仍然指它。如果只有旧的
x
的名称是不可访问的,则销毁该值听起来像是物理上不可访问的。@SimonShine具体发生什么取决于编译器内部。
f
的一个相对简单的优化是将
x
替换为文本2。我以为情况就是这样。在任何情况下,当我使用销毁这个词时,我想到的是
x
2
的绑定,而不是值
2
的实例,因为该绑定在该环境中不再存在。我会把措辞改得更加谨慎。
f(z,w) = f(3,4) = 2 + 3 + 4 = 9