Das Hinzufügen der Typensignatur verursacht einen Kompilierungsfehler

8

In Haskell kann ich eine Funktion wie folgt definieren:

%Vor%

Wenn ich anal sein möchte, kann ich der letzten Zeile eine Typensignatur hinzufügen:

%Vor%

Ich kann auch eine Funktion bar in Form einer Typklasse definieren:

%Vor%

Wenn ich jedoch der Implementierung von bar eine Typensignatur hinzufüge (eine gutartige Änderung, oder so dachte ich), bekomme ich einen Kompilierungsfehler.

%Vor%

Und hier ist der Fehler:

%Vor%

Ich denke, der Fehler bedeutet, dass der Compiler nicht davon überzeugt ist, dass die b in der Implementierung von bar mit der b in der Typsignatur von bar übereinstimmt. Ich bin mir jedoch nicht sicher, warum das der Fall ist.

Warum bekomme ich diesen Kompilierfehler, wenn ich meiner Funktionsimplementierung eine Typ-Signatur hinzufüge?

    
jcarpenter2 21.01.2014, 22:10
quelle

2 Antworten

2

Ihr Problem ist der Umfang der Typvariablen. Wenn Sie

schreiben %Vor%

Die erste Zeile (die Typdeklaration für bar ) hat einen eigenen Bereich für Typvariablen und in der zweiten Zeile sieht sie :: b als ein anderes b von Rel a b .

Wenn Sie die Erweiterung ScopedTypeVariables aktivieren und Ihren Typ als

deklarieren %Vor%

Dann erstreckt sich der Geltungsbereich von b über die Definition von bar .

    
bheklilr 21.01.2014, 22:14
quelle
6

Sie benötigen tatsächlich eine Spracherweiterung und ein wenig zusätzliche Syntax, um die beiden Variablen b type gleich zu machen:

%Vor%

Das forall sagt im Wesentlichen: " a und b sollten für die gesamte Definition im Geltungsbereich sein", und ScopedTypeVariables wird benötigt, um diese Syntax verwenden zu dürfen.

Ich denke, das ist wirklich eine historische Warze im Design der Sprache.

    
Ganesh Sittampalam 21.01.2014 22:13
quelle

Tags und Links