Warum verletzt dieser Code nicht die "Sättigungsanforderung von Typfamilien"?

8

Ich habe dieses minimale Arbeitsbeispiel (aus der Singletons -Bibliothek) für die Zuordnung einer Typfamilie über eine Typ-Ebene ausgewählt Liste:

%Vor%

Es scheint zu funktionieren:

%Vor%

Der Code wird im Beitrag Defunktionalisierung für den Gewinn erläutert. Dies ist ein Workaround für die Tatsache, dass "GHC eine Typvariable nicht mit einer Typfamilie vereinheitlichen lässt". Dies wird als "Sättigungsanforderung von Typfamilien" bezeichnet.

Mein Zweifel ist: Wenn wir " :kind! Map (TyCon1 Flip) '[Char,Int] " ausführen, scheint es, dass type instance Apply (TyCon1 f) x = f x in der Zeile f mit unserer Flip type-Familie übereinstimmt. Warum verstößt das nicht gegen die Sättigungspflicht?

    
danidiaz 23.11.2016, 07:49
quelle

1 Antwort

2

Ich beantworte meine eigene Frage mit Informationen aus den Kommentaren von dfeuer und user2407038.

Es hat sich herausgestellt, dass mein Code die Sättigungsanforderung verletzt hat . Ich habe den Fehler wegen eines seltsamen Verhaltens (Bug?) Von :kind! in ghci nicht gefunden. Aber das Schreiben des Typs in die hs -Datei selbst ergibt einen Kompilierungsfehler.

TyCon1 ist nicht für Typfamilien gedacht, sondern für das Umschließen von regulären Typkonstruktoren wie Maybe , die kein Problem mit Typvariablen haben. type Foo = Map (TyCon1 Maybe) '[Char,Int] funktioniert zum Beispiel gut.

Für Typfamilien müssen wir einen speziellen Hilfstyp für jede von ihnen definieren und dann eine Apply -Instanz für den Typ definieren. So:

%Vor%

Beachten Sie, dass die Flip type-Familie auf diese Weise nicht mit einer beliebigen Typvariablen vereinheitlicht wird.

    
danidiaz 24.11.2016, 20:57
quelle