2012-04-11 14 views
5

Ich habe kürzlich versucht, "mir ein Haskell zu lernen", und ich möchte einen neuen Typ erstellen, um einen Integer-Zustand darzustellen, ohne nur eine rohe Ganzzahl zu verwenden (für Typsicherheit und Code-Klarheit). Insbesondere der folgende Code kompiliert:Warum muss ein Haskell-Typ "Integral ableiten" "Ableiten von Enum" sein?

newtype AuxState = AuxState Integer 
    deriving (Eq, Ord, Num, Integral, Real, Enum) 

Da es eine unendliche Anzahl von Staaten in meiner Anwendung ist, habe ich kein Interesse an diesen Zustand in einen Enum umwandeln. Allerdings, wenn ich versuchen, die deriving (Enum) Aussage zu entfernen, so dass es nur deriving (Eq, Ord, Num, Integral, Real) ist, der Compiler beschwert sich:

No instance for (Enum AuxState) 
    arising from the 'deriving' clause of a data type declaration 
Possible fix: 
    add an instance declaration for (Enum AuxState) 
    or use a standalone 'deriving instance' declaration, 
     so you can specify the instance context yourself 
When deriving the instance for (Integral AuxState) 

ich es schwer zu glauben, dass Haskell einen Typ in der Integral-Klasse zwingt auch in der Enum-Klasse zu sein; sollte es nicht einfach umgekehrt sein? Gibt es einen Grund dafür, oder verstehe ich etwas falsch?

+2

Enum-Instanzen sind sequenziell geordnete Typen - ihre Werte können aufgelistet werden. Der Hauptvorteil der Enum-Typklasse besteht darin, dass wir ihre Werte in Listenbereichen verwenden können. Sie haben auch definierte Nachfolger und Vorgänger, die wir mit den Succ und Pred-Funktionen erhalten können. Ich glaube, dass alle ganzen Zahlen zu dieser Klasse gehören sollten, warum sollten deine nicht gehören? –

+1

"Da es jedoch eine unendliche Anzahl von Zuständen in meiner Anwendung gibt, ..." Ich denke, Sie haben ein falsches Verständnis von "Enum". 'Enum' ist kein Typ mit einer endlichen Anzahl von Werten. – newacct

+1

"sollte es nicht einfach umgekehrt sein?" 'Double' ist ein' Enum', aber offensichtlich nicht 'Integral' – newacct

Antwort

8

Alle Integral sind unbedingt Enum, weil die Grundlagen der Mathematik Integral die succ und pred Operationen sind. (Technisch steht Enum für eine richtige Typenhierarchie, wo ein Integral Typ eine mathematische Halbgruppe ist, denke ich.) Andersherum scheint noch mehr falsch: Sie meinen, dass jeder Enum sollte Integral sein? Enthält dies zufällige ADTs wie

data Foo = A | B | C | D | E | F | G deriving (Enum) 

?

(Every Enum sollte auf eine Untergruppe von Integral, isomorph sicherlich, aber das legt nahe, es tatsächlich in die andere Richtung gehen: Integral jede Enum darstellen kann, aber nicht umgekehrt, so ist Integral Art des ur- Enum.)

+0

Ich würde nicht sagen "Integral" ist eine Halbgruppe. Es ist eine Art euklidische Domäne (d. H. Eine schöne Vielfalt von Ringen), aber mit einigen zusätzlichen Einschränkungen. –

6

Der technische Grund ist, weil, weil Integral in Prelude ist wie folgt definiert:

class (Real a, Enum a) => Integral a where 
    ... 

Der mathematische Grund ist, dass jeder integraler Typ ist enumerable aber keine t umgekehrt. Denken Sie zum Beispiel an rationale Zahlen. Beachten Sie, dass Enum keine endliche Enumeration impliziert, wie in Integer gezeigt.

Verwandte Themen