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