Can I automatically generate a list of data values ​​in Haskell?

Let's say I create an enumerable set data(or two) in 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)

I would like to have access to a list of these values, and this is the only way I know how:

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]

This is like a redundant pattern. Is this the only way to create such a list, or will Haskell do it for me somehow?

+4
source share
1 answer

if you add automatic derivingfor Enumand Boundedas simple as

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]

Example:

λ> notes
[C,CsDb,D,DsEb,E,F,FsGb,G,GsAb,A,AsBb,B]

I think you will know how to do another;)


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]
+12

Source: https://habr.com/ru/post/1617202/


All Articles