programming-languages - SML: "Behind the scenes"不可变变量?

标签 programming-languages immutability sml

我有关于标准机器学习 (SML) 的问题。我读到 SML 的变量不会变化。当一个值绑定(bind)到一个变量时,它就被永久设置并且不能更改。

我的问题:它是如何“在幕后”工作的;即在内存中。例如,如果运行以下程序:

val a = 5;
val a = a + 1;

解释器会在内存中为"new"a分配一个新位置吗?

这个想法有什么好处?感觉比C等编程语言效率低。

最佳答案

变量在 SML 中确实有所不同,就像变量在数学中有所不同一样。也就是说,一般来说,它们在不同的情况下可以代表不同的值(value)观。例如,

fun f x =
  let val a = x + 1 in ... end

此处,a 的值随 x 变化。这就是数学中“变量”一词的本义。

你不能做的是改变一个变量。在给定范围内,相同的变量将始终代表相同的值。将不变性设置为默认值有很多优点,例如,它可以防止整个类别的错误,并且更容易推理程序,特别是在涉及嵌套函数时。

仍然可以发生突变,但在机器学习中,这是一个单独的概念并且更加明确。您需要使用引用文献:

let
  val r = ref 1
in
  f (!r);
  r := 2;
  f (!r)
end

最后,您的示例演示了一种完全不同的现象,即声明的遮蔽。这不是 ML 独有的东西,您的程序类似于以下 C 语言:

{
  const int a = 5;
  {
    const int a = a + 1;
  }
}

唯一真正的区别是,在 C 中,在第二个声明的右侧使用 a 使其递归引用(尚未定义)第二个 a ,而在 SML 中,默认情况下声明是非递归的,因此右侧的 a 引用第一个声明。

因为它会使程序对人类读者来说更加困惑,所以不建议在程序中使用阴影,无论是哪种语言。您始终可以通过重命名其中一个变量来避免这种情况。

关于programming-languages - SML: "Behind the scenes"不可变变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54777237/

相关文章:

java - 在 Java 中定义我自己的不可变数组

parsing - Scala 解析 SML 的相互递归函数

c++ - 与电子组件(步进电机等)交互的良好编程语言(或一组C++库)是什么?

javascript - 除了 First Class Functions 和 Lexical Scoping,JavaScript 与 Scheme 实现有什么共同之处?

c - 编写文本编辑器时保存数据的好方法

c++ - 像计算机一样思考的策略

javascript - 为什么在 React 中调用 'setState()' 时使用扩展运算符?

字符串的 Java 不变性,使用 "+="运算符

closures - 函数闭包与延续,一般和 SML

function - SML 中具有用户数据类型的部分函数