val x = 2
fun f (z,w) = x + z + w
val z = 3
val x = 4
val ans = f(z,x)
为什么ans的值为9? 在f中,我认为x值记为2,因为在使用f(z,w)时,已声明val x且未声明x 我说的对吗?
答案 0 :(得分:2)
您表达问题的方式表明您在考虑变量。 SML实际上没有像Java这样的语言具有变量的方式具有变量。它具有值,可以将其命名为。在val x = 2
中,值2
绑定到名称x
。此时,x
和2
之间没有真正的区别。这是因为SML是一种功能语言,它强制执行referential transparency,其中在任何表达式中,变量都可以用其值替换,而无需更改表达式的含义。因此在
fun f (z,w) = x + z + w
可以将x
替换为2
,而无需更改表达式的含义。因此,此定义等同于
fun f (z,w) = 2 + z + w
稍后,您的代码将创建一个新值4,并且(合法地,尽管有些不一致)还为该新值x
命名。这将创建一个全新的绑定。您没有更改 x
–销毁了(或至少永久遮盖了)旧的x
并创建了一个新的x
。新的x,z
是最终函数调用中使用的。 4,3
的值分别在代码f(z,w) = f(3,4) = 2 + 3 + 4 = 9
中的那个位置,因此具有参照透明性
body {
margin: 0;
}
.container {
height: 90vh; /*height of the blue + margin-top of the pink*/
}
.blue {
height: 50vh;
position: sticky;
top: 0;
background: blue;
color: white;
text-align: center;
}
.pink {
height: 500vh;
background: pink;
}