Ich versuche, eine Instanz von Enum für die folgende Art zu schreiben:Haskell Aufzählung
-- Type declarations:
-- Octave
data Octave =
O1 | O2 | O3
deriving (Show, Read, Eq, Ord, Bounded, Enum)
-- Note
data Note =
A | B | C | D | E | F
deriving (Show, Read, Eq, Ord, Bounded, Enum)
-- Pitch
data Pitch = Pitch Octave Note
deriving (Show, Eq, Ord)
-- Why doesn't this work?
instance Enum Pitch where
fromEnum (Pitch o n) = (fromEnum o)*6 + (fromEnum n)
toEnum x = (Pitch o n)
where
o = toEnum (x `div` 6)
n = toEnum (x `mod` 6)
Dies funktioniert gut für:
[(Pitch O1 A) .. (Pitch O3 F)]
Aber nicht für:
[(Pitch O1 A) .. ]
Mit der Fehler:
*** Exception: toEnum{Octave}: tag (3) is outside of enumeration's range (0,2)
Ich verstehe den Fehler. Meine Fragen sind: Wie schreibt man die Enum-Instanz korrekt, um diese Aufzählung durchzuführen? Ist es möglich? Am allermeisten: Ist es eine gute Praxis?
Danke! 'enumFrom x = map toEnum [fromEnum x ..17] 'Ist das ein guter Stil? – dos