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:
Wenn ich jedoch der Implementierung von bar
eine Typensignatur hinzufüge (eine gutartige Änderung, oder so dachte ich), bekomme ich einen Kompilierungsfehler.
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?
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
Dann erstreckt sich der Geltungsbereich von b
über die Definition von bar
.
Sie benötigen tatsächlich eine Spracherweiterung und ein wenig zusätzliche Syntax, um die beiden Variablen b
type gleich zu machen:
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.