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?
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? –
"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
"sollte es nicht einfach umgekehrt sein?" 'Double' ist ein' Enum', aber offensichtlich nicht 'Integral' – newacct