-- 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)
Bu için çalışıyor:
[(Pitch O1 A) .. (Pitch O3 F)]
Ama başarısız:
[(Pitch O1 A) .. ]
ile hata:
*** Exception: toEnum{Octave}: tag (3) is outside of enumeration's range (0,2)
Hatayı anlıyorum. Sorularım şunlardır: Bu numaralandırma için Enum örneğini doğru şekilde yazmak nasıl? Mümkün mü? En önemlisi: Bu iyi bir uygulama mı?
enumFrom x = map toEnum [fromEnum x ..]
geçersiz kılma sizin örneği tarafından doğru olanı yapmak için:
Teşekkürler! 'enumFrom x = harita toEnum [fromEnum x ..17] 'Bu iyi bir stil mi? – dos