2015-11-01 262 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

(即使複製的解決方案是短!)