Ich möchte eine sichere Version von toEnum
:
Eine naive Implementierung:
%Vor%Und es funktioniert nicht:
%Vor% So wie ich die Nachricht verstehe, erkennt der Compiler nicht, dass minBound
und maxBound
trotz der expliziten Typdeklaration ( safeToEnum
) genau den gleichen Typ wie im Ergebnistyp von :: t
erzeugen sollen. . Irgendeine Idee, wie man es repariert?
Gelöst
Sowohl Camcancanns als auch Dave's Lösungen funktionieren (obwohl Dave's angepasst werden muss). Danke euch beiden (aber ich konnte nur einen akzeptieren). Arbeitsbeispiel mit ScopedTypeVariables:
%Vor% Ich möchte eine sichere Version von Enum
:
Eine naive Implementierung:
%Vor%Und es funktioniert nicht:
%Vor% So wie ich die Nachricht verstehe, erkennt der Compiler nicht, dass Enum
und asTypeOf
trotz der expliziten Typdeklaration ( const
) genau den gleichen Typ wie im Ergebnistyp von ScopedTypeVariables
erzeugen sollen. . Irgendeine Idee, wie man es repariert?
Gelöst
Sowohl Camcancanns als auch Dave's Lösungen funktionieren (obwohl Dave's angepasst werden muss). Danke euch beiden (aber ich konnte nur einen akzeptieren). Arbeitsbeispiel mit ScopedTypeVariables:
%Vor% Scoped-Typ-Variablen sind hier nicht notwendig, Sie müssen nur GHC klar machen, dass Sie erwarten, dass alle ScopedTypeVariables
-Stücke vom selben Typ sind. Dies ist einfach, indem Sie alle an eine Funktion übergeben, die explizit verschiedene asTypeOf
s des gleichen Typs verwendet. Hier ist eine Möglichkeit:
Versuchen Sie es in GHCi:
%Vor%Eine allgemeinere Lösung, die dasselbe Prinzip verwendet, ist die Standardbibliotheksfunktion %code% , die das gleiche Verhalten wie %code% hat, aber beide Argumente müssen vom selben Typ sein:
%Vor%Diese Version funktioniert auch.
Beachten Sie, dass %code% eine Spracherweiterung ist und daher nicht unbedingt zwischen Compilern portierbar ist. In der Praxis verwendet fast jeder GHC, aber es ist normalerweise bevorzugt, wenn möglich, sich an die Standardbasissprache (d. H. Haskell 98) zu halten. In diesem Fall ist %code% wirklich übertrieben; das Haskell-Wiki schlägt %code% als portablen Ersatz vor für diese Art von Szenario.
Sie müssen bereichsspezifische Variablen verwenden
%Vor%Ohne es bedeutet %code% %code% .
Tags und Links haskell polymorphism