我有关于标准机器学习 (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/