在数学中,变量意味着您可以在其中放置任何数字,并且方程式仍然成立:
root(square(x)) = abs(x)
在编程语言中,情况并非如此:var可以更改。在Python中:
y = (x**2)**.5
x *= 2
assert y == abs(x)
将引发异常,因为最后一行中的x不相同。
是否有使用不可变变量的编程语言?
在数学中,变量意味着您可以在其中放置任何数字,并且方程式仍然成立:
root(square(x)) = abs(x)
在编程语言中,情况并非如此:var可以更改。在Python中:
y = (x**2)**.5
x *= 2
assert y == abs(x)
将引发异常,因为最后一行中的x不相同。
是否有使用不可变变量的编程语言?
Answers:
要回答您的标题问题“任何编程语言都像在数学中一样使用变量吗?”:C,C#,Java,C ++和任何其他C风格语言在数学中使用变量的方式。
您只需要使用==而不是=。
如果我拿你的原件
root(square(x)) = abs(x)
然后,我可以将其直接转换为C#,而无需更改语法。
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
只要x平方小于所用数据类型的最大值,对于x的任何值,该值都将为true。 (Java会非常相似,但我相信Math命名空间会有所不同)
下一位将无法在C#中编译,因为编译器足够聪明,知道我无法将一个操作的返回值分配给另一操作。
Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)
不变性与此无关。您仍然需要使用不可变的语言来分配值,并且给定的语言完全有可能选择使用=作为运算符来执行此操作。
进一步证明这一点,此循环将一直运行,直到用尽x的合法值并获得溢出异常为止:
while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
{
++x;
System.Console.WriteLine(x);
}
这就是为什么数学家讨厌使用=进行赋值的原因。它使他们感到困惑。我认为这使您感到困惑。举个例子
y = (x**2)**.5
x *= 2
assert y == abs(x)
当我把它变成代数时,我得到:
abs(2x)=根(x ^ 2)
当然,对于除0以外的其他值而言,哪一个是不正确的。当您在评估原始方程式的左手边和右手边之间添加额外的步骤时,不变性只会使您免于更改x值的错误。它实际上并没有改变如何你计算表达式。
纯函数式编程语言(例如Haskell)强制执行不可变变量。我喜欢称它们为标识符,而不是变量。
您也可以通过不允许类更新来模拟Python中的不变性。如前所述,大多数纯函数式编程语言都具有不变性。Clojure是JVM平台的最新成员(Clojure是LISP的方言)
在Scala(也是JVM语言)中,用声明的OO和FP支持变量的统一val
是不可变的。Scala的表现力和OO / FP混合支持使其看起来与Mathematica相似。(Akka是一个框架,向Scala和Java添加了Erlang OTP和Clojure功能,例如STM..。)LACASA添加了类型系统和编程模型,以在Scala中强制执行对象功能规程,并提供唯一的对象引用。(代码)(理论背景)
在Java中,声明的变量final
是不可变的,而Java库(例如Google Guava)包括集合的不可变库。Java String
也总是不可变的。