首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Haskell中的循环生成子列表

从Haskell中的循环生成子列表
EN

Stack Overflow用户
提问于 2015-11-24 16:54:11
回答 4查看 85关注 0票数 2

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

代码语言:javascript
运行
复制
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]

这样的话

代码语言:javascript
运行
复制
ghci> getNotes E
[E, F, FsGb, G, GsAb, A, AsBb, B, C, CsDb, D, DsEb] 

我可以想出一些草率的方法来做这件事,但我觉得应该有一个明显的,非常Haskellian的方式。有什么建议吗?

EN

Stack Overflow用户

发布于 2015-11-24 17:03:02

我只是

代码语言:javascript
运行
复制
getNotes root = [root .. maxBound] ++ init [minBound .. root]

但我看得出来你更喜欢循环的方法。怎么样

代码语言:javascript
运行
复制
getNotes root = map snd . take 12 $ [(0,root) .. ]

...sadly,这实际上是行不通的:它需要一个(Enum a, Enum b, Bounded b) => Enum (a,b)实例,由于某种原因没有定义它,至少在序曲中没有定义。

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

代码语言:javascript
运行
复制
getNotes root = take 12 . drop (fromEnum root) $ cycle [minBound .. maxBound]
票数 3
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33899439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档