Jon*_*rop 15 types wolfram-mathematica
与大多数编程语言不同,Mathematica中的每个值都是一个表达式.对任何表达式应用任何操作总会产生另一个表达式 因此,Mathematica实际上只有一种类型.Mathematica没有静态类型检查,可以说,甚至不动态检查类型(在运行时).
例如,将整数表达式添加1到"foo"Mathematica中的字符串表达式会导致(无意义)表达式1 + "foo"但没有错误.在其他情况下,Mathematica提供有关无意义输入的反馈,但生成此反馈的检查必须由程序员明确执行.
因此,将Mathematica描述为无类型语言而不是静态或动态类型语言是否公平?
小智 18
Mathematica所拥有的不是"类型",而是"头部"的概念,其中任何Mathematica表达都拥有一个.这符合他们的"一切都是表达"范式.
人们可以通过函数和对象来看Mathematica表达式的结构.举例来说,回报,回报,回报,回报,回报率(假设你还没有分配任何东西到),返回,返回......我敢肯定,你明白我的意思了.FullForm[]Head[]Head[3]IntegerHead[2/3]RationalHead[I]ComplexHead[.3]RealHead[a]SymbolaHead["a"]StringHead[{2}]List
这样做的好处在于,人们可以编写函数,使得他们只能接受具有特定头的参数.例如:
f[x_Real] := x^2
f[3]
f[3]
f[3.]
9.
Run Code Online (Sandbox Code Playgroud)
这个讨论上的图案应该给你如何设置功能,以使它们与特定的头或套头仅对象工作思路.
如果我们将短语"静态类型"和"动态类型"视为术语,指的是当语言检查操作对类型的有效性时,那么我认为使用术语"无类型"来表征Mathematica是公平的 - 在某种意义上说它"从不"检查操作是否对类型有效.
不过,我确实喜欢Belisarius使用术语"类型不可知".我这样说是因为虽然语言中的几乎所有类型检查都是惯用的(即由程序员而不是语言实现),因此将操作符应用于键入操作数的概念也是如此!
考虑一下"荒谬"的例子1 + "foo".我认为可以公平地说,所有Mathematica用户的很大一部分(接近统一)会因为他们第一次学习语言而绊倒这样的案例.当一个人用C语言编写代码时,这个问题就特别明显了.在Mathematica圈子里,有很多关于如何处理这些情况的讨论.
另一方面,这种弱点也是Mathematica最大的优势.Mathematica针对创建新标记进行了优化.许多很多符号的概念与+基本算术中的加法非常相似.在构建这样的符号时,如果Mathematica介入并抱怨操作数+不是数字,那将非常不方便.在Mathematica的这种更高级别的应用中,"荒谬"的例子不仅是"感性的",而且实际上是至关重要的.
因此,考虑到这一点,类型问题经常没有实际意义.因此,我喜欢Belisarius的"类型不可知"特征.向我推荐,我做了;)
编辑
在区分"无类型"和"类型不可知"时,我会尝试澄清我的想法.
阅读各种答案和评论,我试图弄清楚Mathematica和LISP之间的区别.后者通常被视为"动态类型"的一个例子,尽管核心LISP评估器非常像Mathematica,几乎没有任何类型检查.我们在LISP程序中看到的类型错误主要由(通常是内置的)函数中的硬编码检查发出. +例如,即使评估者本身不关心某种方式,也只接受数字参数.话虽如此,LISP编程的"感觉"与Mathematica的"感觉"(至少对我而言)有很大不同.这个1 + "foo"例子真正捕捉到了这种差异.
虽然我普遍认同"无类型"作为Mathematica的特征,但我仍然觉得缺少了某些东西.汇编似乎无类型我一样,早期的FORTRAN和预ANSI C.在这种情况下,参数的比特模式是所有要紧,如果我通过地方需要整数字符串参数的程序将愉快地继续.Mathematica肯定会分享这种无关紧要的行为.但是有一个区别:在汇编程序和FORTRAN和C中,缺乏类型检查导致良好结果的情况极为罕见.正如我上面提到的,在Mathematica中,依赖于这种行为是可能的,有时甚至是常见的.
输入"类型不可知".我喜欢它的非承诺立场,听起来不像"无类型"那样激烈.我觉得这反映了数学的基本上无类型性质,但左为易于支持的LISP惯用的类型检查,动态式的(即"头"的成语和支持功能)的语言特性的一些回旋余地.
所以,简而言之,我觉得Mathematica在完全无类型和动态类型之间徘徊."类型不可知"为我捕获了这种情绪.YMMV :)
我欣然承认,没有人可能只是通过检查短语"无类型"和"类型不可知"来重建我在这个回答中所写的任何内容.我再次强调,我认为"无类型"数学是一个公平的表征,但我也喜欢这样的事实,"第二类不可知"回避了很多问题通过各方面的反应正在解决这个问题的SO.
Mathematica确实有一些类型,它是动态的.你有类型的String,Integer,Real,Complex,List和Symbol.您可以通过执行类似操作来创建仅在一种类型上运行的函数
f[x_Integer]:=x+1
创建一个只对整数运算的函数.
Mathematica严重依赖于模式和替代; 这些类型在我看来似乎是另一种帮助你开发模式的方法.在这种情况下1 + "foo",没有模式来评估添加到字符串的数字,因此结果只是表达式本身.在这种情况下1 + 2,有一个模式来添加数字并进行评估.Mathematica的模式和替换规则可能要复杂得多,如果您感兴趣,最好阅读一本书.
更多的是从实践而不是理论方面来看,我相信您可能会说 Mathematica 与类型无关而不是无类型。
此外,您可以使用以下内容轻松构建类型化子语言(非常基本的示例如下):
Unprotect[Set];
Set[a, x_] := If[Element[x, Integers], x, 0, 0];
Run Code Online (Sandbox Code Playgroud)
然后尝试:
a = 1; (*runs ok*)
Run Code Online (Sandbox Code Playgroud)
和
a = "caca" (*assigns zero to a*)
Run Code Online (Sandbox Code Playgroud)
编辑
此外,您可以将用户定义类型构造为命名模式,并在上面的Set重新定义中使用它们,而不是整数。
类型组合应该以同样的方式工作。
简短的回答:无类型或无类型。这就是 Wolfram Research 对产品本身的描述。看这里。
长答案:乔恩,我认为你的问题实际上取决于你所说的非类型化的含义。为了吸引维基百科这一权威资源,“相比之下,无类型语言,例如大多数汇编语言,允许对任何数据执行任何操作,这些数据通常被认为是不同长度的位序列。”
阅读之前的答案,争论的核心似乎是类型检查器遇到错误时应该做什么。通常的答案是停止评估并报告某种错误。从 Stackoverflow 上的几个早期问题(1)和(2)中,我们可以看到,没有一种优雅的方法可以在 Mathematica 中内置此操作。(我想补充一点,在版本 8 中更加强调编译为 C,可以编写类型检查代码,但我不确定这是否应该算作主要语言的一部分。)