2016-07-03 10 views

Antwort

6

Ihre Erklärung der IntOrString Art scheint, dass Sie einen Typen angeben mögen, die entweder eine ganze Zahl oder eine Zeichenfolge halten können. Das haben Sie jedoch nicht erstellt. Ich empfehle das Lesen der section on Union Types in der Elm Guide.

Wenn Sie einen Union-Typ deklarieren, müssen Sie Konstruktoren erstellen. In Ihrem Beispiel erstellen Sie einen Typ mit zwei Konstruktoren, von denen keiner einen Parameter enthält. Obwohl Sie sie Int und String nennen, haben sie keine Beziehung zu Elms nativen Typen Int und String. In diesem Fall können sie in einer Sprache wie C# oder Java als Enum betrachtet werden.

Außerdem verursacht Ihre Deklaration Verwirrung beim Compiler, weil Sie Konstruktornamen erstellt haben, die mit vorhandenen Typen kollidieren. Daher wird der Compiler an anderer Stelle in Ihrem Code verwirrt, wenn Sie Int oder String sagen.

Lassen Sie uns den Typ neu definieren, so dass er zu einem einzelnen Typ wird, der einen Integer- oder String-Wert enthalten kann. Ich werde auch die Konstruktoren umbenennen, um Namenskollisionen zu vermeiden.

type IntOrString 
    = MyString String 
    | MyInt Int 

Und jetzt können Sie zwicken die getInt Funktion auf der neuen Definition basiert. Beachten Sie, wie Musterabgleich verwendet wird, um den String oder Integer-Wert aus dem IntOrString Wert zu ziehen, basierend auf dem Konstruktor verwendet wurde, um es zu schaffen:

getInt : IntOrString -> String 
getInt intOrString = 
    case intOrString of 
    MyString s -> 
     s 

    MyInt i -> 
     toString i 
+0

Hallo Chad, vielen Dank für die Klärung. Ich dachte an Union-Typen in Sprachen wie Typoskript, wo Sie mit jedem eingebauten Typ kombinieren können. aber das ist etwas anderes mit einem gleichen Namen. – Prabhjot