Sicher und polymorph zu Enum

8

Ich möchte eine sichere Version von toEnum :

schreiben %Vor%

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%     
sastanin 30.04.2010, 10:36
quelle

2 Antworten

13
___ tag123haskell ___ Haskell ist eine funktionale Programmiersprache mit starker statischer Typisierung, verzögerungsfreier Auswertung, umfangreicher Parallelitäts- und Parallelitätsunterstützung und einzigartigen Abstraktionsfunktionen. ___ tag123polymorphism ___ In der Informatik ist Polymorphie eine Programmiersprache, mit der Werte verschiedener Datentypen einheitlich behandelt werden können. ___ qstntxt ___

Ich möchte eine sichere Version von Enum :

schreiben %Vor%

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%     
___ answer2744712 ​​___

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:

%Vor%

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.

    
___ qstnhdr ___ Sicher und polymorph zu Enum ___ answer2744270 ___

Sie müssen bereichsspezifische Variablen verwenden

%Vor%

Ohne es bedeutet %code% %code% .

    
___
C. A. McCann 30.04.2010, 13:15
quelle
3

Sie müssen bereichsspezifische Variablen verwenden

%Vor%

Ohne es bedeutet t forall t. t .

    
dave4420 30.04.2010 11:54
quelle

Tags und Links