假设我data在Haskell中创建了一个可枚举的集合(或两个).
data Note = C | CsDb | D | DsEb | E | F | FsGb | G | GsAb | A | AsBb | B deriving (Read, Show, Eq, Ord)
data Diatonic = Unison | Min2 | Maj2 | Min3 | Maj3 | Per4 | Tritone | Per5 | Min6 | Maj6 | Min7 | Maj7 | Octave deriving (Read, Show, Eq, Ord)
Run Code Online (Sandbox Code Playgroud)
我想访问这些值的列表,这是我知道的唯一方法:
notes :: [Note]
notes = [C, CsDb, D, DsEb, E, F, FsGb, G, GsAb, A, AsBb, B]
diatonics :: [Diatonic]
diatonics = [Unison, Min2, Maj2, Min3, Maj3, Per4, Tritone, Per5, Min6, Maj6, Min7, Maj7, Octave]
Run Code Online (Sandbox Code Playgroud)
这似乎是多余的样板.这是创建这样一个列表的唯一方法,还是Haskell能以某种方式为我做这个?
Car*_*ten 12
如果您添加自动deriving为Enum和Bounded它一样简单:
data Note = C | CsDb | D | DsEb | E | F | FsGb | G | GsAb | A | AsBb | B
deriving (Read, Show, Eq, Ord, Enum, Bounded)
notes :: [Note]
notes = [minBound .. maxBound]
Run Code Online (Sandbox Code Playgroud)
例:
?> notes
[C,CsDb,D,DsEb,E,F,FsGb,G,GsAb,A,AsBb,B]
Run Code Online (Sandbox Code Playgroud)
我猜你会知道如何做另一个;)
你需要Enum的[ .. ]语法和Bounded用于minBound和maxBound-这样你就不必使用Bounded,如果你不想要的,但在这种情况下,你必须添加边界自己:
data Note = C | CsDb | D | DsEb | E | F | FsGb | G | GsAb | A | AsBb | B
deriving (Read, Show, Eq, Ord, Enum)
notes :: [Note]
notes = [C .. B]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |