2015-11-01 271 views
1

我想创建一个无限列表如下递归列出

(1:[]):(2:2:[]):(3:3:3:[]) ... 

我已经尝试了很多,我能想到的最好的是

function = (1:[]) : map (\n -> n) ( from 2) 

我相信,这种需要是完成递归,但我不能看到它

任何提示或帮助将是巨大的感谢

回答

3

这个怎么样:

concatMap (\x -> replicate x x) [1..] 

它没有明确的递归,但做你想做的。

由于凯沙夫基尼指出,你可能想要的版本无连接:

map (\x -> replicate x x) [1..] 
+1

我想你的意思只是'map(\ x - > replicate xx)[1 ..]',不是吗? – kini

+0

是的,你是对的。 – somesoaccount

+5

只是为了好玩,请注意'(\ x - > replicate xx)'只是'join replicate',所以你可以把它写成'map(join replicate)[1 ..]';或者更短,如'加入复制<$> [1 ..]'。 – amalloy

1

这里是一个递归定义的建议:

lss = [1]:map (\ls -> (1+head ls):(map (+1) ls)) lss

(即使复制的解决方案是短!)