Haskell: Heterogene Liste für Daten mit Phantomvariablen

8

Ich lerne gerade über existenzielle Quantifizierung, Phantomtypen und GADTs. Wie gehe ich vor, um eine heterogene Liste eines Datentyps mit einer Phantomvariablen zu erstellen? Zum Beispiel:

%Vor%

Funktionen wie unten sind OK:

%Vor%

Ich würde jedoch gerne eine heterogene Liste wie folgt deklarieren können:

%Vor%

Ich habe versucht, eine leere Typklasse zu verwenden, um den Typ in a von:

einzuschränken %Vor%

Aber das obige würde nicht kompilieren. Ich konnte mithilfe der existenziellen Quantifizierung Folgendes erreichen:

%Vor%

Aber auf diese Weise kann ich keine Funktion anwenden, die auf dem spezifischen Typ von a in Toy a bis T z. addOne oben.

Zusammenfassend, wie kann ich eine heterogene Liste erstellen, ohne die Phantom-Variable zu vergessen / zu verlieren?

    
gspindles 10.02.2015, 17:30
quelle

4 Antworten

8

Beginnen Sie mit dem Toy -Typ:

%Vor%

Nun können Sie es in ein existentielles ohne mit dem Klassensystem übergeneralisieren:

%Vor%

Da der Wrapper nur Toy s enthält, können wir sie auspacken und erhalten Toy s zurück:

%Vor%

Und jetzt können Sie Dinge innerhalb der Liste unterscheiden:

%Vor%

Bearbeiten

Wie Cirdec hervorhebt, können die verschiedenen Stücke ein wenig auseinandergenommen werden:

%Vor%

Ich sollte auch beachten, dass hier bisher nichts das Toy GADT rechtfertigt. Bheklilrs einfacherer Ansatz, einen einfachen algebraischen Datentyp zu verwenden, sollte gut funktionieren.

    
dfeuer 10.02.2015, 18:03
quelle
5

Die gewöhnliche heterogene Liste, die durch eine Liste der Typen ihrer Elemente indiziert ist, ist

%Vor%

Wir können dies ändern, um Werte innerhalb von f :: * -> * zu speichern.

%Vor%

Mit dem Sie zeros schreiben können, ohne die Typvariablen zu vergessen.

%Vor%     
Cirdec 10.02.2015 17:57
quelle
4

Vor ein paar Tagen gab es eine sehr ähnliche Frage / p>

In Ihrem Fall wäre es

%Vor%

Es ist leicht, eine Existenz zu beseitigen:

%Vor%

Wenn Sie einen Recursor für den Toy -Datentyp

haben %Vor%

Sie können eine umschlossene toy :

zuordnen %Vor%

Zum Beispiel

%Vor%

Dieser Ansatz ähnelt dem in @ dfeuer's Antwort, aber es ist weniger ad hoc.

    
user3237465 10.02.2015 19:40
quelle
1

Hast du mit Data.Typeable gespielt? Eine Typeable -Einschränkung ermöglicht es Ihnen, Vermutungen an dem Typ durchzuführen, der durch das Existential verborgen ist, und auf diesen Typ zu werfen, wenn Sie richtig raten.

Nicht dein Beispiel, sondern ein Beispielcode, den ich herumliegen habe:

%Vor%     
Luis Casillas 10.02.2015 22:56
quelle