Ihre Idee ist richtig, im Geist aber Haskell verwendet getaggten Gewerkschaften (auch „diskriminierte Gewerkschaften“, „disjunkte Vereinigungen“, „Varianten“ genannt, und „sum Arten“). Das bedeutet, dass Sie ein zusätzliches Tag benötigen, um festzustellen, ob Sport mit Fußball konstruiert wurde oder ob es mit Tennis gebaut wurde.
data Sport = SportFootball Football | SportTennis Tennis
Diese Tags werden in Haskell als Daten Konstrukteuren bekannt. Das heißt, das definiert einen Konstruktor SportFootball :: Football -> Sport
und einen Konstruktor SportTennis :: Tennis -> Sport
.
Angenommen, Haskell benötigt dieses zusätzliche Tag nicht, was wäre dann dieser Typ?
data UntaggedInt = Int | Int
Eine nicht markierte Vereinigung sollte die Eigenschaft (x | x) = x
haben und so muss dies gleichwertig sein:
data UntaggedInt = Int
Während bei getaggten Gewerkschaften wir definieren:
data TaggedInt = This Int | That Int
Das heißt, daß die Gewerkschaften markiert ist sind nicht idempotent.
Betrachten Sie auch etwas anderes, was ohne Konstrukteure passiert. Angenommen, wir haben eine Definition wie:
data UntaggedLists = String | [String]
Und jetzt sind wir bei der Suche nach der Art des Ausdrucks "hello world"
beauftragt. Sollte der Typ String
oder UntaggedLists
sein? Dann nehmen wir eine ähnliche Definition haben:
data AnotherUntaggedLists = String | [String]
Ist es wahr, dass UntaggedLists
und AnotherUntaggedLists
gleich Typen sind?
Dies sind keine unbeantwortbaren Fragen, aber es zeigt einen tiefgreifenden systematischen Unterschied zwischen Tags und nicht.
Nun, Sie haben einen Konstruktor 'Football :: Spieler ein -> Stadion ein -> Fußball ein' gemacht, und jetzt haben Sie einen zusätzlichen Konstruktor' Football :: Sport' gemacht. –
Beachten Sie auch, dass Datensatzfeldnamen in Kleinbuchstaben geschrieben werden müssen: 'Stadium' darf kein Feld sein. – chi
Ich korrigiere meinen Fehler, indem ich Sport a = Fußball a | Tennis a aber immer noch das Problem geht weiter – Babas