gpt4 book ai didi

haskell - 我可以在 Haskell 中自动生成数据值列表吗?

转载 作者:行者123 更新时间:2023-12-04 22:19:46 27 4
gpt4 key购买 nike

假设我在 Haskell 中创建了一个可枚举的 data 集(或两个)。

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)

我想访问这些值的列表,这是我知道的唯一方法:
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]

这似乎是多余的样板。这是创建这样一个列表的唯一方法,还是 Haskell 可以以某种方式为我做?

最佳答案

如果您为 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]

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

我猜你会知道如何做另一个;)

您需要 Enum[ .. ] 语法和 BoundedminBoundmaxBound - 因此,如果您不想要,则不必使用 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]

关于haskell - 我可以在 Haskell 中自动生成数据值列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33889134/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com