是否有任何编程语言都像在数学中一样使用变量?


11

在数学中,变量意味着您可以在其中放置任何数字,并且方程式仍然成立:

root(square(x)) = abs(x)

在编程语言中,情况并非如此:var可以更改。在Python中:

y = (x**2)**.5
x *= 2
assert y == abs(x)

将引发异常,因为最后一行中的x不相同。

是否有使用不可变变量的编程语言?


5
在数学中,大多数方程式不是恒等式。例如,当且仅当x = 1或x = 5时,x ^ 2 + 5 = 6x有效。方程对于某些“宇宙”中的所有值(例如,所有实数的集合)均有效,例如sin( 2x)= 2 sin x cos x,称为恒等式
Andreas Rejbrand

4
数学中的变量!=编程语言中的变量。我一直认为它们也应该使用不同的名称,因为当许多人将数学变量的预见带入编程时会感到困惑。
Lie Ryan

1
我认为数学中的变量目标与编程中的目标不同。在数学中,变量表示您想知道的未知值,或者表示您将值放在结果中的公式中的位置。对于常见的编程语言,只有第二种情况才有意义。对于第一种情况,您需要使用Mathematica之类的软件。
Pagotti

不,他们没有。尝试将任何数字放在“ x = 5”上。

Answers:


6

要回答您的标题问题“任何编程语言都像在数学中一样使用变量吗?”: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值的错误。它实际上并没有改变如何你计算表达式。


24

纯函数式编程语言(例如Haskell)强制执行不可变变量。我喜欢称它们为标识符,而不是变量。


3
在不纯的功能语言Erlang中,变量也是不可变的。
sepp2k 2010年

我对Erlang不太了解。那是原子,对不对?Erlang是否允许任何形式的可变变量式存储?
Ionuț G. Stan

3
@Ionut:不,Erlang原子被称为Lisp和红宝石中的符号。关于您的第二个问题:它具有流程字典,它是一个全局(按流程划分)的可变哈希图。但是,以我的经验很少使用。除此之外,打破引用透明性的唯一方法是消息传递。
sepp2k 2010年

4
嗯,我应该向自己学习一些Erlang :)
Ionuț G. Stan,2010年

这如何回答所提问题?
蚊蚋

5

=编程语言中使用的符号具有误导性。 <-,意思是“商店”,甚至MOVE应该使用COBOL 。

另外,Prolog使用类似于数学的变量:变量不能更改,Prolog引擎将填充变量以查看解决方案是否存在。

另外,咖喱是Haskell和Prolog的混合体。


3

C,C ++和Objective-C可以使用“ const”类型限定符为函数(和方法)参数以及其他变量(标识符)指定不变性。


3

您也可以通过不允许更新来模拟Python中的不变性。如前所述,大多数纯函数式编程语言都具有不变性。ClojureJVM平台的最新成员(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也总是不可变的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.