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