Was ist ein Typ in der Programmiersprache Wolfram Mathematica?

  • "Alles ist ein Ausdruck" ist ein populäres Zitat aus vielen Mathematica -Anleitungen. Was ist also ein Typ in Mathematica ? In welcher Beziehung stehen sie zu gängigen Typen von Haskell?

    Ich habe einige -Simulationen von abhängigen Typen ausgeführt:

     DependentType::illegal= "Value is illegal for dependent types with constraints";
    FixedSizedVector[n_?(Positive[#]&)] :=
    Module[{type = Symbol["Vector" <> ToString[n]]},
        type[dat_] := Message[DependentType::illegal] /; VectorQ[dat] && Length[dat] != n;
        type
    ];
    types =
    Map[
        FixedSizedVector[#]&,
        Range[1, 25]
    ];
     

    Ich habe ein Array types von Symbolen erhalten, die durch Musterprüfungsregeln eingeschränkt sind. Handelt es sich um eine Familie von Typen?

    Ein anderer Punkt ersetzt Head. Zum Beispiel kann ich für die Liste Range[1, 5] einfach Plus @@ Range[1, 5] eingeben und Integer[15] abrufen. Was ist aus der Sicht des Typs Apply?

    04 December 2012
    halirutan
3 answers
  • Die nächstgelegenen Mathematica-Typen sind "Kopf" von Ausdrücken, die Atome sind. Zum Beispiel:

     Through[{AtomQ, Head}[2]]
    
    {True, Integer}
    
    Through[{AtomQ, Head}[2 + I]]
    
    {True, Complex}
    
    Through[{AtomQ, Head}["cat"]]
    
    {True, String}
     

    und so weiter ...

    Es gibt auch etwas andere "Typen" im Kontext von Compile.

    25 March 2012
    Andrzej Kozlowski
  • In Mathematica wird der Typ eines eingebauten Objekts durch Head dargestellt. Beispielsweise ist Head[3] Integer, Head[1.5] ist Real und Head[a] ist Symbol (vorausgesetzt, a wurde natürlich kein Wert zugewiesen, weil Sie in diesem Fall natürlich ' Ich erhalte die Head dieses Werts.)

    Beachten Sie, dass für Ausdrücke der Form foo[bar,baz] der Kopf foo ist. Die meisten Ausdrücke werden intern in einer solchen Form dargestellt, wie durch Anwenden von FullForm angezeigt wird, zum Beispiel:

     {1, 2, 3}//FullForm
    (*
    ==> List[1, 2, 3]
    *)
    a + b //FullForm
    (*
    ==> Plus[a, b]
    *)
     

    und folglich gibt Head im ersten Fall List und im zweiten Fall Plus an.

    Bearbeiten

    Beachten Sie, dass Mathematica den an Head gegebenen Ausdruck möglichst auswertet. Das Ergebnis von Head[1+2] ist nicht Plus, sondern Integer, da Head ] wird erst ersetzt, nachdem 1+2 ausgewertet wurde, was den Wert 3 vom Typ Integer ergibt. Andererseits gibt Head[a+b] Plus an (vorausgesetzt, dass weder a noch b eine zutreffende Definition haben), da a+b unter Bewertung "inert" ist: Es gibt keine Bewertungsregeln, die darauf angewandt werden könnten. daher wertet es sich selbst aus. Das Gleiche gilt für das Ersetzen des Kopfes (Apply, @@). Beachten Sie in diesem Zusammenhang auch, dass Mathematica im Gegensatz zur typischen Funktionssprache die Auswertung fortsetzt, bis ein "inerter" Ausdruck erreicht wird, der nicht weiter ausgewertet werden kann. Dies wird am besten durch den folgenden Mathematica-Code veranschaulicht:

     foo := bar;
    bar := 3;
    foo
    (*
    ==> 3
    *)
     

    Hier im ersten Schritt wertet Mathematica foo aus. , was zu bar ausgewertet wird. Aber es hört nicht auf, sondern bewertet weiterhin bar, was das Ergebnis 3 ergibt. Nun kann dieses Ergebnis nicht weiter ausgewertet werden und wird daher als Ergebnis angegeben. Andererseits wird der scheinbar äquivalente Lisp-Code

     (progn
      (setq foo 'bar)
      (setq bar 'baz)
      foo)
     

    nach bar ausgewertet, da nach Auswertung von foo an bar, Lisp versucht nicht, eine Neubewertung vorzunehmen.

    26 March 2012
    Brett Champion
  • Seit Mathematica 10 gibt es den TypeSystem` -Kontext, nach dem Sie fast suchen. Es handelt sich lediglich um einen Wrapper für Muster.

     TypeSystem`ConformsQ[
      {1, 2, 3}, 
      TypeSystem`Vector[TypeSystem`IntegerT, 3]
    ]  (* --> True *)
     

    Diese Funktion wird von Dataset-Funktionen intern verwendet. (Vielleicht sollte man zuerst etwas wie Dataset[{}] sagen, um das TypeSystem zu benutzen; ich bin zu faul, um noch einmal zu prüfen, ob es notwendig ist.)

    Leider nicht dokumentiert, aber Sie können es herausfinden, wenn Sie die Namen i n ?TypeSystem`* und a t GeneralUtilities`PrintDefinitions @ TypeSystem`Validation`PackagePrivate`vtor betrachten.

    TypeSystem`Either funktioniert (wie?) nicht wie erwartet, Siehe jedoch meinen Patch .

    25 January 2016
    Melvin Ram