2017-08-21 1 views
3

Ich habe ein kleines Problem beim Erstellen von Datentypen.Haskell: Multiple Deklaration des Datentyps

Ich habe zwei Datentypen, Fußball und Tennis

data Football a = Football 
    { players  :: Players a  
    , Stadium  :: Stadium a 
    }  

data Tennis a = Tennis 
    { players1  :: Players a  
    , Stadium1  :: Stadium a 
    } 

Und ich möchte einen anderen Datentyp Sport verwendet als Konstrukteur den Datentyp Fußball und Tennis data Sport a = Football a | Tennis a und ich erhalte den folgenden Fehler erstellen, mehrere Erklärungen von Fußball Ich verstehe nicht, was ich falsch mache.

Mit freundlichen Grüßen

+3

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. –

+1

Beachten Sie auch, dass Datensatzfeldnamen in Kleinbuchstaben geschrieben werden müssen: 'Stadium' darf kein Feld sein. – chi

+0

Ich korrigiere meinen Fehler, indem ich Sport a = Fußball a | Tennis a aber immer noch das Problem geht weiter – Babas

Antwort

8

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.

+0

Danke mein Freund! Schöne Antwort :) – Babas

Verwandte Themen