Types 数学是一种非类型语言吗?

Types 数学是一种非类型语言吗?,types,wolfram-mathematica,Types,Wolfram Mathematica,与大多数编程语言不同,Mathematica中的每个值都是一个表达式。对任何表达式应用任何操作都会生成另一个表达式。因此,Mathematica实际上只有一种类型。Mathematica不进行静态类型检查,甚至(在运行时)也不动态检查类型 例如,将整数表达式1添加到Mathematica中的字符串表达式“foo”,将导致(无意义的)表达式1+“foo”,但没有错误。在其他情况下,Mathematica提供有关无意义输入的反馈,但生成此反馈的检查必须由程序员明确执行 因此,将Mathematica

与大多数编程语言不同,Mathematica中的每个值都是一个表达式。对任何表达式应用任何操作都会生成另一个表达式。因此,Mathematica实际上只有一种类型。Mathematica不进行静态类型检查,甚至(在运行时)也不动态检查类型

例如,将整数表达式
1
添加到Mathematica中的字符串表达式
“foo”
,将导致(无意义的)表达式
1+“foo”
,但没有错误。在其他情况下,Mathematica提供有关无意义输入的反馈,但生成此反馈的检查必须由程序员明确执行


因此,将Mathematica描述为非类型化语言而不是静态或动态类型化语言是否公平?

Mathematica确实有一些类型,并且是动态的。您有
字符串
整数
实数
复数
列表
符号
。您可以通过执行以下操作来创建只在一种类型上运行的函数

f[x_整数]:=x+1

创建只对整数运算的函数


Mathematica主要基于模式和替换;在我看来,类型总是另一种帮助你发展模式的方式。在
1+“foo”
的情况下,没有模式来计算添加到字符串中的数字,因此结果只是表达式本身。在
1+2
的情况下,有一种模式可以添加数字,并对其进行评估。Mathematica的模式和替换规则可能要复杂得多,如果你感兴趣,最好读一本书。

更多的是从实际角度出发,而不是从理论角度出发,我相信你可能会说Mathematica更不分类型

此外,您可以使用以下内容轻松构造类型化子语言(非常基本的示例如下):

然后尝试:

a = 1; (*runs ok*) 

编辑

此外,您可以将用户定义的类型构造为命名模式,并在重新定义上面的集合时使用它们,而不是整数。

类型组合应该以相同的方式工作。

如果我们把“静态类型”和“动态类型”短语当作行话,指的是当一种语言检查对类型的操作的有效性时,那么我认为用行话“非类型化”来表征Mathematica是公平的。检查操作是否对类型有效

然而,我确实喜欢贝里萨利斯对“类型不可知论者”一词的使用。我这样说是因为,虽然语言中几乎所有的类型检查都是惯用的(即,由程序员而不是语言实现),但将运算符应用于类型化操作数的概念也是如此

考虑一下
1+“foo”
的“无意义”示例。我认为公平地说,Mathematica用户中有相当一部分(接近unity)在第一次学习Mathematica语言时会遇到这样的情况。当一个人以C的风格编写代码时,这个问题尤其明显。在Mathematica圈子里,关于如何处理这样的情况有很多讨论

另一方面,这个弱点也是Mathematica最大的优势。Mathematica针对创建新符号进行了优化。很多很多符号都有
+
的概念,其行为非常类似于初等算术中的加法。在构建这样一种表示法时,如果Mathematica介入并抱怨
+
的操作数不是数字,那将非常不方便。在Mathematica这种更高层次的应用中,“荒谬”的例子不仅是“感性的”,而且实际上是至关重要的

因此,考虑到这一点,类型问题经常是没有意义的。因此,我喜欢“类型不可知论”的刻画。投他一票,我投了;)

编辑

在区分“非类型”和“类型不可知论者”时,我将试图澄清我的想法

通过阅读各种答案和评论,我试图找出Mathematica和LISP之间的区别。后者通常被认为是“动态类型”的一个例子,尽管核心LISP计算器与Mathematica非常相似,几乎没有任何类型检查。我们在LISP程序中看到的类型错误主要是由硬编码的检入(通常是内置)函数发出的<例如,代码>+将只接受数字参数,即使计算器本身不关心这种或那种方式。话虽如此,LISP编程的“感觉”与Mathematica的“感觉”有很大不同(至少对我而言)。
1+“foo”
示例真正抓住了这一差异

虽然我大体上同意“非类型化”作为Mathematica的特征,但我仍然觉得缺少了一些东西。对我来说,汇编程序似乎是非类型化的,早期的FORTRAN和前ANSI C也是如此。在这些情况下,参数的位模式才是最重要的,如果我在需要整数的地方传递字符串参数,程序将愉快地继续运行。Mathematica当然也有这种非类型的行为。但有一点不同:在汇编语言、FORTRAN和C语言中,很少会因为缺乏类型检查而产生好的结果。正如我上面提到的,在Mathematica中,依赖这种行为是可能的,有时甚至是常见的

输入“类型不可知”。我喜欢它的非承诺立场,听起来没有“非类型化”那么激烈。我觉得它反映了Mathematica本质上的非类型化特性,但为那些易于支持LISP动态风格中惯用类型检查的语言特性(即“head”惯用语和支持功能)留下了一些回旋余地

总之,我觉得Mathematica徘徊在完全非类型化和动态类型化之间。“类型不可知论者”抓住了那个哨兵
a = 1; (*runs ok*) 
a = "caca"  (*assigns zero to a*)
f[x_Real] := x^2

f[3]
f[3]

f[3.]
9.