Wie löst man in Haskell einen Typ-Familienmuster-Übereinstimmungsfehler aus?

8

Kann Haskell einen Typ-Familien-Übereinstimmungsfehler anzeigen? Zum Beispiel mit einer geschlossenen Familie:

%Vor%

Der Typ von Testf Int ist nur Testf Int . Der Compiler erzeugt keinen Fehler. Ist es möglich, es zu generieren, wenn es keine Übereinstimmungen gibt?

    
rityzmon 23.05.2016, 16:45
quelle

2 Antworten

7

Nicht möglich. Well-Kinded-Familienanwendungen lösen Fehler niemals selbst aus. Stattdessen erhalten wir nur Typfehler, wenn wir versuchen, unreduzierte Familienausdrücke für etwas zu verwenden.

Wir können benutzerdefinierte Typen verwenden, die Fehlermeldungen enthalten, um Fehler ein wenig klarer zu machen:

%Vor%

Nun gibt GHC einen Fehler aus und druckt unsere Meldung immer dann, wenn wir Error msg verwenden, um einen nicht definierten Wert einzugeben.

Von GHC 8.0 können wir % verwenden. co_de% um unsere Nachricht auf eine schönere Weise zu drucken:

%Vor%

Dies würde drucken:

%Vor%

Dies wirft jedoch immer noch den Fehler auf die Verwendung:

%Vor%     
András Kovács 23.05.2016, 16:58
quelle
4

Das ist unmöglich in GHCs vor 8.0, aber das (wie dies geschrieben wurde) einfach -veröffentlichte GHC 8.0.1 fügt Unterstützung für hinzu benutzerdefinierte Typfehler .

Die Idee ist, dass, genau wie die Funktion error :: String -> a in jedem Typ mit einem Fehler auf der Termebene lebt, wir jetzt in GHC.TypeLits , die Typfamilie

%Vor%

, das einen beliebigen -Typ mit einem -Typ-Fehler enthält. Der ErrorMessage -Typ ist sehr einfach:

%Vor%

Der (:<>:) -Konstruktor verkettet zwei Fehlermeldungen horizontal; Der (:$$:) -Konstruktor verkettet sie vertikal. Die anderen beiden Konstruktoren tun, was sie sagen.

In Ihrem Beispiel können Sie also den letzten Fall mit einem TypeError ; zum Beispiel,

%Vor%

Der Versuch, pure () vom Typ Testf Int zu verwenden, schlägt mit dem Fehler

fehl %Vor%

Beachten Sie, dass bei der Definition

%Vor%

ist korrekt gebrochen und hat

definiert %Vor%

(oder ähnlich mit testfInt = testfInt ) hat gut funktioniert.

Hier ist eine vollständige Beispiel-Quelldatei:

%Vor%     
Antal Spector-Zabusky 23.05.2016 17:35
quelle