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

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]


我可以想到一些草率的方法来执行此操作,但是感觉应该有一种明显的非常Haskellian的方法。有什么建议吗?

最佳答案

您可以进行的最小更改是使用dropWhile

getNotes :: Note -> [Note]
getNotes root = take 12 . dropWhile (/= root) . cycle $ [minBound .. maxBound]

09-25 15:31