Mathematica是一种无类型的语言吗?
与大多数编程语言不同,Mathematica中的每个值都是一个表达式。 对任何表达式应用任何操作总是会产生另一个表达式。 因此,Mathematica实际上只有一种类型。 Mathematica不做静态类型检查,可以说,甚至不会动态检查类型(运行时)。
例如,将整数表达式1
添加到Mathematica中的字符串表达式"foo"
中会导致(无意义的)表达式1 + "foo"
但不会出现错误。 在其他情况下,Mathematica提供关于无意义输入的反馈,但产生该反馈的检查必须由程序员明确执行。
因此,将Mathematica描述为非类型语言而不是静态或动态类型语言是否公平?
简短的回答:无类型或无类型。 Wolfram Research就是这样描述产品的。 看这里。
长的回答:乔恩,我认为你的问题真的取决于你的意思是无类型的。 吸引维基百科的权威资源“相比之下,无类型语言(如大多数汇编语言)允许对任何数据执行任何操作,这些数据通常被认为是不同长度的位序列。”
阅读早期的答案,似乎辩论的核心是类型检查器在遇到错误时该做什么。 通常的答案是停止评估并报告某种错误。 从前面几个关于Stackoverflow的问题(1)和(2),我们可以看出,Mathematica并没有一种优美的内置方法。 (我想补充说明的是,在第8版中,更强调编译C语言,可以编写类型检查代码,但我不确定这是否应该作为主要语言的一部分。)
Mathematica所具有的是“头”的概念,而Mathematica的表达式只有一个,而不是“类型”。 这符合他们的“一切都是表达”的范例。
可以通过函数FullForm[]
和Head[]
来查看Mathematica表达式的结构。 举例来说, Head[3]
返回Integer
, Head[2/3]
回报Rational
, Head[I]
返回Complex
, Head[.3]
返回Real
, Head[a]
返回Symbol
(假设你还没有分配到任何a
), Head["a"]
返回String
, Head[{2}]
返回List
...我相信你已经明白了。
这样的美妙之处在于,人们可以编写功能,以便他们只能接受特定头像的争论。 例如:
f[x_Real] := x^2
f[3]
f[3]
f[3.]
9.
关于模式的这种讨论应该给你提供关于如何设置功能的想法,使得它们只能用于具有特定头部或头部组的对象。
如果我们认为短语“静态类型”和“动态类型”作为行话指的是语言何时检查操作对类型的有效性,那么我认为使用术语“无类型”来描述Mathematica是公平的 - 在某种意义上它“从不”检查操作是否对某个类型有效。
但是,我确实喜欢Belisarius使用“类型不可知”这个术语。 我这样说是因为虽然几乎所有语言中的类型检查都是惯用的(即由程序员实现,而不是语言),但将操作符应用于键入操作数的概念也是如此!
考虑1 + "foo"
的“无意义”例子。 我认为可以公平地说,在他们第一次学习这门语言时,所有Mathematica用户的很大一部分(接近统一)都会在这种情况下出行。 这个问题在编写代码的时候尤其明显,例如C的风格。Mathematica的圈子里有很多关于如何处理这些情况的讨论。
另一方面,这个弱点也是Mathematica最大的优势。 Mathematica针对创建新符号进行了优化。 很多很多符号具有+
的概念,与初等算术中的加法行为非常类似。 在构建这样一个符号,它会非常不方便,如果数学介入并抱怨说,操作数+
是不是数字。 在Mathematica的这样一个更高层次的应用中,“无意义”的例子不仅是“感性的”,而且实际上是至关重要的。
所以,考虑到这一点,类型的问题通常是没有意义的。 因此,我喜欢Belisarius的“类型不可知”特征。 upvote他,我做了;)
编辑
在区分“无类型”和“类型不可知”时,我会试着澄清一下我的想法。
通过阅读各种答案和评论,我试图找出Mathematica和LISP之间的区别。 后者通常被认为是“动态类型”的一个例子,尽管核心LISP评估者非常像Mathematica,几乎没有任何类型检查。 我们在LISP程序中看到的类型错误主要是由硬编码的(通常内置的)函数发布的。 +
,例如,只会接受数值参数,即使评估者本身不会在乎某种方式或另一种方式。 话虽如此,LISP中编程的“感觉”与Mathematica的“感觉”(至少对我而言)有很大的不同。 1 + "foo"
示例真正捕获了这种差异。
虽然我大致赞同“无类型”作为Mathematica的特征,但我仍然觉得缺少某些东西。 对于我来说,汇编程序看起来没有类型化,就像早期的FORTRAN和pre-ANSI C一样。在这些情况下,参数的位模式是非常重要的,如果我在需要整数的情况下传递字符串参数,那么程序会继续。 Mathematica当然会分享这种无类型的行为。 但是有一个区别:在汇编器和FORTRAN和C中,这种缺少类型检查导致很好的结果是非常罕见的。 正如我上面提到的,在Mathematica中,依靠这种行为是可能的,有时甚至是常见的。
输入“类型不可知”。 我喜欢它的非承诺立场,听起来不像“无类型”那么激烈。 我觉得它反映了Mathematica本质上是无类型的本质,但为那些易于支持LISP中的惯用类型检查,动态样式(即“头部”成语和支持功能)的语言特性留下了一些摆动空间。
所以,总之,我觉得Mathematica在完全无类型和动态类型之间徘徊。 “类型不可知论”捕捉到了我的情绪。 YMMV :)
我很乐意承认,没有人可能通过检查短语“无类型”和“类型不可知”来重构我在这个回复中写的任何内容。 我再一次强调,我认为“无类型”是Mathematica的一个公平表征,但我也喜欢“类型不可知”引发了许多问题,这些问题是通过对这个SO问题的各种反应解决的。
链接地址: http://www.djcxy.com/p/35503.html