gpt4 book ai didi

haskell - 在 Haskell 中从循环生成子列表

转载 作者:行者123 更新时间:2023-12-02 10:37:52 25 4
gpt4 key购买 nike

假设我有一个包含 12 个音符的列表(它们有自己的数据类型),并且我想要一个函数来返回以给定音符开头并循环的音符列表。

data Note = C | CsDb | D | DsEb | E | F | FsGb | G | GsAb | A | AsBb | B deriving (Read, Eq, Ord, Enum, Bounded)
getNotes :: Note -> [Note]
getNotes root = take 12 $ doSomething root $ cycle noteList
where noteList :: [Note]
noteList = [minBound..maxBound]

这样

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

我可以想到一些草率的方法来做到这一点,但感觉应该有一个明显的、非常 haskell 式的方法。有什么建议吗?

最佳答案

我只是

getNotes root = [root .. maxBound] ++ init [minBound .. root]

但我可以看出您更喜欢循环方法。怎么样

getNotes root = map snd . take 12 $ [(0,root) .. ]

...可悲的是,这实际上不起作用:它需要一个 (Enum a, Enum b, Bounded b) => Enum (a,b) 实例,对于某些人来说原因没有定义,至少在前奏中没有。

或者,您可以使用root的索引:

getNotes root = take 12 . drop (fromEnum root) $ cycle [minBound .. maxBound]

关于haskell - 在 Haskell 中从循环生成子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33899439/

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