在sml中,关于范围的问题是模棱两可的

时间:2018-09-29 10:13:45

标签: sml smlnj

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 我说的对吗?

1 个答案:

答案 0 :(得分:2)

您表达问题的方式表明您在考虑变量。 SML实际上没有像Java这样的语言具有变量的方式具有变量。它具有,可以将其命名为。在val x = 2中,值2绑定到名称x。此时,x2之间没有真正的区别。这是因为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;
}