"Kind" verwirrt über forall in typisierten GADTs

8

Ich bin in einer seltsamen Situation in GHC 8.0.1 mit gut indizierten (?) GADTs gelandet, bei denen das Einführen von Foralls in die Typ-vs-Art-Signaturen zu unterschiedlichen Typenprüfungsverhalten führt.

Betrachten Sie die folgenden Datentypen:

%Vor%

Dieser Datentyp wird einfach kompiliert. Wenn wir jedoch die Art von x im Konstruktor G angeben möchten, erhalten wir einen Typfehler.

%Vor%

Die Fehlermeldung ist

%Vor%

Wenn wir die forall zur Art-Signatur hinzufügen (mit oder ohne forall im Konstruktor), gibt es keinen Fehler.

%Vor%

Was ist los?

    
Jennifer Paykin 10.12.2016, 01:22
quelle

1 Antwort

3

Autor von TypeInType hier. K. A. Buhr macht es richtig oben; Das ist nur ein Fehler. Es ist in HEAD behoben.

Für die allzu neugierigen: Diese Fehlermeldung soll Definitionen wie

beseitigen %Vor%

wo

%Vor%

kann von Data.Proxy importiert werden. Bei der Deklaration eines Datentyps in Haskell98-artiger Syntax müssen existentiell quantifizierte Variablen explizit in den Geltungsbereich mit forall einbezogen werden. Aber k wird nie explizit in den Geltungsbereich gebracht; Es wird nur in der Art von a verwendet. Das bedeutet, dass k universell quantifizierbar sein sollte (mit anderen Worten, es sollte ein unsichtbarer Parameter für J sein, wie der Parameter k bis Proxy ) ... aber wenn wir J schreiben, Es gibt keine Möglichkeit zu bestimmen, was k sein sollte, also wäre es immer mehrdeutig. (Im Gegensatz dazu können wir die Wahl für den k -Parameter auf Proxy entdecken, indem wir uns die Art von a ansehen.)

Diese Definition für J ist in 8.0.1 und in HEAD nicht erlaubt.

    
Richard Eisenberg 11.12.2016, 18:56
quelle

Tags und Links