2010-12-29 5 views
12

Im Gegensatz zu den meisten Programmiersprachen ist jeder Wert in Mathematica ein Ausdruck. Wenn Sie eine Operation auf einen beliebigen Ausdruck anwenden, erhalten Sie immer einen anderen Ausdruck. Folglich hat Mathematica effektiv nur einen Typ. Mathematica führt keine statische Typprüfung durch und prüft Typen nicht einmal dynamisch (zur Laufzeit).Ist Mathematica eine untypisierte Sprache?

beispielsweise Addieren des ganzzahligen Ausdruck 1 an den String-Ausdruck "foo" in Mathematica Ergebnissen in den (unsinnigen) expression 1 + "foo" aber keinen Fehler auf. In anderen Fällen liefert Mathematica eine Rückmeldung über unsinnige Eingaben, aber die Überprüfungen, die diese Rückmeldung erzeugen, müssen explizit vom Programmierer durchgeführt werden.

Ist es also fair, Mathematica als eine nicht typisierte Sprache im Gegensatz zu einer statisch oder dynamisch typisierten Sprache zu beschreiben?

+1

@Yaroslav Bulatov: Der Beitrag, den du zitiertest, handelte von Mathematicas Leistung. Diese Stack-Overflow-Frage hat überhaupt nichts mit Mathematicas Leistung zu tun. Hier geht es darum, das Typsystem von Mathematica zu klassifizieren. –

+2

die Frage scheint subjektiv –

+2

@Yaroslav Bulatov: Wie so? –

Antwort

3

Die kurze Antwort: Untyped oder typeless. So beschreibt Wolfram Research das Produkt selbst. See here.

Lange Antwort: Jon, ich glaube, Ihre Frage ist wirklich hängt davon ab, was Sie von nicht typisierten bedeuten. Um an die definitive Ressource zu appellieren, die lautet: Wikipedia "Im Gegensatz dazu erlaubt eine untypisierte Sprache, wie die meisten Assemblersprachen, jede Operation an beliebigen Daten durchzuführen, die allgemein als Sequenzen von Bits verschiedener Länge betrachtet werden."

Lesen Sie die früheren Antworten, es scheint der Kern der Debatte ist, was sollte ein Typ-Checker, wenn es einen Fehler auftritt. Die übliche Antwort ist, die Auswertung zu STOPPEN und einen Fehler zu melden. Aus einigen früheren Fragen (1) und (2) auf Stackoverflow können wir sehen, dass es keine anmutige Art und Weise gibt, dies in Mathematica eingebaut zu machen. (Ich würde den Vorbehalt hinzufügen, dass mit größerer Betonung der Kompilierung zu C in Version 8 geschriebener Code geschrieben werden kann, aber ich bin nicht sicher, ob dies als Teil der Hauptsprache gezählt werden sollte.)

4

Mathematica hat einige Arten, und es ist dynamisch. Sie haben die Typen String, Integer, Real, Complex, List und Symbol. Sie können Funktionen erstellen, die auf nur eine Art Betrieb von so etwas wie

f[x_Integer]:=x+1

tun, eine Funktion zu erstellen, die nur auf ganze Zahlen arbeiten.

Mathematica basiert stark auf Mustern und Substitutionen; Die Typen scheinen mir immer eine andere Möglichkeit zu sein, Muster zu entwickeln. Im Fall von 1 + "foo" gibt es kein Muster zum Auswerten einer Zahl, die zu einer Zeichenfolge hinzugefügt wurde. Das Ergebnis ist also nur der Ausdruck selbst. Im Fall von 1 + 2 gibt es ein Muster zum Hinzufügen der Zahlen und es wird ausgewertet. Die Muster und Substitutionsregeln von Mathematica können sehr viel komplexer sein, und es ist am besten, ein Buch zu lesen, wenn Sie interessiert sind.

+7

Die Verwendung von 'Integer' usw. als Typen ist nur eine Konvention: Das Muster' x_Integer' passt immer dann, wenn der Kopf von 'x'' Integer' ist. Also 'Mit [{x = Integer [" Hallo "]} würde f [x]' 'Integer [" Hallo "] + 1' geben ... – Janus

+0

@ Janus: Das hat offensichtlich eine gewisse Ähnlichkeit mit dem Laufzeittyp Tags, die in den Implementierungen dynamischer Sprachen verwendet werden, aber der Unterschied ist, dass die "Funktion" 'f' keine Funktion ist, sondern eine Rewrite-Regel. –

+1

@ Jon Harrop. Genau. Ich habe nur versucht zu sagen, dass das, was wie ein Typsystem aussehen könnte, nur eine grobe Annäherung an ein Typsystem ist - mit absolut keinen Verträgen. – Janus

4

Mehr von der praktischen, als die theoretische Seite der Dinge, glaube ich, dass Sie sagen können, dass Mathematica mehr typ-agnostic als untypisiert ist.

Darüber hinaus können Sie bauen einfach eine typisierte Unter Sprache Dinge verwenden, wie (sehr einfaches Beispiel folgt):

Unprotect[Set]; 

Set[a, x_] := If[Element[x, Integers], x, 0, 0]; 

und dann versuchen:

a = 1; (*runs ok*) 

und

a = "caca" (*assigns zero to a*) 

Bearbeiten

Darüber hinaus können Sie benutzerdefinierte Typen als benannte Muster erstellen und sie in der Neudefinition von Set oben statt Ganzzahlen verwenden.
Typzusammensetzung sollte auf die gleiche Weise funktionieren.

+1

Können Sie den Unterschied zwischen untypisiert und "typ agnostisch" näher erläutern? –

+0

+1 weil ich mag "typ agnostic", aber wenn Sie Religion aus dem, was leicht in einen heiligen Krieg absteigen könnte, können Sie es nennen "optional typisiert." Sie können jedes Modell annehmen, das für Ihr Problem funktioniert, solange Sie nicht erwarten, dass es absolut unzerbrechlich ist. Zum Beispiel statisch: 'f [a_List]'; dynamisch: "Kopf [a]"; untypisiert: 'g [a_]'. In Wirklichkeit ist MMA weder Fisch noch Geflügel, und das liegt wahrscheinlich an seiner Entstehung als Computersystem (gegenüber einer allgemeinen Sprache). Sie könnten auch fragen: "Ist es eine funktionale Sprache? Wenn nicht, was dann?" und erhalten viel mehr widersprüchliche Antworten. –

+0

@Tim Ich mag heilige Kriege nicht, also entschied ich mich, die Antwort so zu lassen, wie sie ursprünglich gepostet wurde, und unterlasse es, mich dazu zu äußern. Ich denke, dass Ihr Kommentar zu meinen Gedanken passt und vielleicht viel klarer als meine Antwort. –

5

Wenn wir die Ausdrücke "statisch getippt" und "dynamisch typisiert" als Jargon betrachten, wenn eine Sprache die Gültigkeit von Operationen gegen Typen überprüft, dann ist es richtig, Mathematica mit dem Jargon "untypisiert" zu charakterisieren - in dem Sinne, dass es "nie" prüft, ob eine Operation für einen Typ gültig ist.

Ich mag Belisarius 'Verwendung des Begriffs "typ-agnostic" jedoch. Ich sage das, weil, während fast alle Typprüfungen in der Sprache idiomatisch sind (d.h.implementiert vom Programmierer, nicht die Sprache), so ist das Konzept der Anwendung eines Operators auf typisierte Operanden!

Betrachten Sie das "unsinnige" Beispiel von 1 + "foo". Ich denke, es ist fair zu sagen, dass ein bedeutender Bruchteil (nahe der Einheit) aller Mathematica-Benutzer über Fälle wie diese stolpert, wenn sie zuerst die Sprache lernen. Das Problem ist besonders offensichtlich, wenn man Code zum Beispiel in den Stil von C schreibt. In Mathematica-Kreisen gibt es viele Diskussionen darüber, wie man mit solchen Situationen umgeht.

Auf der anderen Seite ist diese Schwäche auch die größte Stärke von Mathematica. Mathematica ist für die Erstellung neuer Notationen optimiert. Viele, viele Notationen haben das Konzept +, das sich sehr ähnlich verhält wie die Addition in der elementaren Arithmetik. Beim Aufbau einer solchen Notation wäre es sehr ungünstig, wenn Mathematica eintrat und beschwerte, dass die Operanden + keine Zahlen waren. In solch einer höheren Anwendung von Mathematica ist das "unsinnige" Beispiel nicht nur "sensibel", sondern tatsächlich entscheidend.

Also, in diesem Sinne ist die Frage des Typs häufig strittig. Daher mag ich Belisarius "typ-agnostische" Charakterisierung. Upvote ihn, ich;)

bearbeiten

Ich werde versuchen zu klären, was ich im Sinn hatte, als zwischen „untypisierten“ und „Typ-Agnostiker“ zu unterscheiden.

Beim Lesen der verschiedenen Antworten und Kommentare versuchte ich herauszufinden, was der Unterschied zwischen Mathematica und LISP war. Letzteres wird allgemein als ein Beispiel für "dynamisch typisiert" gehalten, obwohl der Kern-LISP-Evaluator Mathematica sehr ähnlich ist und kaum eine Typ-Überprüfung durchführt. Die Typfehler, die wir in LISP-Programmen sehen, werden meistens durch hartcodierte Checks in (typischerweise eingebauten) Funktionen ausgegeben. Beispielsweise akzeptiert + nur numerische Argumente, obwohl der Evaluator selbst sich nicht um die eine oder andere Art kümmern kann. Abgesehen davon unterscheidet sich das "Gefühl" der Programmierung in LISP stark von dem "Gefühl" von Mathematica (zumindest für mich). Das 1 + "foo" Beispiel erfasst wirklich diesen Unterschied.

Während ich weitgehend mit "untypisiert" als die Charakterisierung von Mathematica stimme, fühlte ich immer noch, dass etwas fehlte. Assembler scheint für mich untypisiert zu sein, genauso wie früher FORTRAN und pre-ANSI C. In diesen Fällen war das Bitmuster der Argumente alles, worauf es ankommt, und die Programme würden munter weiterlaufen, wenn ich ein Stringargument mit einer ganzen Zahl übergeben würde. Mathematica teilt sicherlich dieses untypische Verhalten. Aber es gibt einen Unterschied: In Assembler und FORTRAN und C ist es äußerst selten, dass dieser Mangel an Typprüfung zu einem guten Ergebnis führt. Wie ich oben erwähnt habe, ist es in Mathematica möglich und manchmal sogar üblich, sich auf diese Art von Verhalten zu verlassen.

Geben Sie "typ-agnostic" ein. Ich mochte seine unverbindliche Haltung und klang weniger drastisch als "untypisiert". Ich fühlte, dass es die im Wesentlichen untypisierte Natur von Mathematica widerspiegelte, ließ aber etwas Spielraum für jene Sprachmerkmale, die bereitwillig die idiomatische Typprüfung im dynamischen LISP-Stil unterstützen (d. H. Das "Kopf" -Idiom und unterstützende Funktionalität).

Also kurz gesagt, ich fühle, dass Mathematica schwebt zwischen völlig untypisiert und dynamisch typisiert. "Typ-agnostisch" hat diese Stimmung für mich erfasst. YMMV :)

Ich gebe gerne zu, dass niemand wahrscheinlich alles, was ich in dieser Antwort geschrieben habe einfach durch die Überprüfung der Sätze "untypisiert" und "typ-agnostic" rekonstruieren kann. Wiederum betone ich, dass "untypisiert" eine faire Charakterisierung von Mathematica ist, aber ich mag auch die Tatsache, dass "typen-agnostisch" viele der Fragen aufwirft, die in den verschiedenen Antworten auf diese SO-Frage behandelt werden.

+0

Wenn jemand anderes meine Antwort abstimmt, haben Sie einen Platz als Kampagnenmanager für meinen senatorischen Lauf: D –

+0

+1 obwohl ich immer noch nicht verstehe, was genau mit "typ agnostic" gemeint ist. Ist der Assembler beispielsweise agnostisch? –

+0

Ich kann nicht ganz nachvollziehen, warum '' '' 'keinen Fehler erzeugt, wenn man '1 +" foo "' verwendet. Wenn der Benutzer wollte, dass dies gültig ist, wenn es ursprünglich einen Fehler erzeugt hat, muss er nur '+' überladen. IMO, '+' erzeugt in diesem Fall keinen Fehler, weil einfach etwas wie '1 + f [x] 'als symbolischer Ausdruck erlaubt sein sollte, und' 1 + String [] 'sieht sehr ähnlich aus. Leider ist das Konzept der symbolischen Variablen/Funktionen (die nichts auswerten) nicht erstklassig in der Mathematik. – masterxilo

14

Statt „Typ“, was Mathematica hat, ist das Konzept eines „Kopfes“, wo jeder Mathematica Ausdruck eines besitzt. Dies steht im Einklang mit ihrer "everything is an expression" paradigm.

Man kann an der Struktur eines Mathematica Expression durch die Funktionen FullForm[] und Head[] peer. Zum Beispiel Head[3] kehrt Integer, Head[2/3] kehrt Rational, Head[I] kehrt Complex, Head[.3] kehrt Real, Head[a] kehrt Symbol (vorausgesetzt, Sie noch nicht etwas-a zugewiesen hatte), Head["a"] kehrt String, Head[{2}] kehrt List ... ich bin sicher, Sie bekommen die Idee schon.

Das Schöne daran ist, dass man Funktionen schreiben kann, so dass sie nur Argumente mit bestimmten Köpfen akzeptieren können. Zum Beispiel:

f[x_Real] := x^2 

f[3] 
f[3] 

f[3.] 
9. 

Diese discussion auf Muster sollten Sie Ideen geben, wie Funktionen einzurichten, so dass sie nur auf Objekte mit speziellen Köpfen oder Sätze von Köpfen arbeiten.

+0

Und wie sehen Sie das in Bezug auf die Klassifizierung von Mathematica als statisch, dynamisch oder un-typisiert? –

+2

@OP und downvoter: Es gibt keine "Typen", nur "Köpfe". Ich persönlich verstehe nicht, warum es so wichtig für Sie ist, es als "typisiert", "untypisiert" oder als solchen Unsinn zu klassifizieren. –

+0

Um 'Plus []' als ein Beispiel zu verwenden, ist die Sache mit Routinen/Funktionen/Prozeduren in * Mathematica *, dass sie den Kopf von (oder allgemeiner gesagt, die Muster, auf die sie abgestimmt sind) ihre Eingaben sehen und entsprechend handeln. '1 + 1/2' gibt ein Ergebnis' 3/2 'mit 'Rational'-Kopf, weil' Plus [] 'weiß, was zu tun ist, wenn eine' Rational'- und eine 'Integer'-Eingabe gegeben wird. Im Gegensatz dazu gibt '1 + Sqrt [2] 'kein" nützliches "Ergebnis, weil' Plus [] 'nicht weiß, wie man mit einer Eingabe mit dem Kopf' Sqrt [] 'umgehen soll. –