如何在 haskell 中定义无限/循环代数数据类型?

Ata*_*ion 5 haskell types cycle infinite

我有一个音符数据类型定义如下:

data Note = Ab | A | Bb | B | C | Db | D | Eb | E | F | Gb | G deriving (Eq, Ord)

我怎样才能使它成为一个实例Enum以便succ G返回Ab

小智 6

您必须Enum自己定义实例:

instance Enum Note where
    fromEnum note = case note of
        Ab -> 0
        A  -> 1
        ...
    toEnum n = case n `mod` 12 of
        0 -> Ab
        1 -> A
        ...
Run Code Online (Sandbox Code Playgroud)

中的“模 12”部分toEnum将循环您的笔记。