【发布时间】:2012-03-30 06:19:40
【问题描述】:
我必须定义一个列表,其中:
- 1 是会员
- 如果 n 是一个成员,那么 2n+1 和 3n+1 也是
所以列表是无限的,必须排序。加载到 GHCi 时,命令:
"take 10 theList"
将产生:
[1,3,4,7,9,10,13,15,19,21]
以下是我的代码:
theList = ([1] ++ concat [[(x*2+1),(x*3+1)]|x<-theList])
它似乎工作,除了它没有排序,与上面相同的命令产生:
[1,3,4,7,10,9,13,15,22,21]
有没有人有办法解决这个问题? 谢谢
【问题讨论】:
-
您的
allInOne函数正是concat。 Haskell 有许多“内置”功能,您可以使用 Hoogle 按类型签名进行搜索(它是让 Haskell 令人惊叹的工具之一!),例如allInOne具有[[a]] -> [a]类型,而 the first result 是您要查找的类型。 :) -
有一个很好的自然实现涉及 corecursion。在某种程度上,它类似于无限的斐波那契数列:
fibs = 0:1:zipWith (+) fibs (tail fibs)。当您已经拥有一定大小的theList时,您将如何扩展列表?
标签: list haskell lazy-evaluation