2013-05-29 40 views
2

我正在玩懒惰列表,似乎无法弄清楚这一点。 我认为我可以通过将它作为一个大的递归函数来解决我的问题,这个函数可以完成所有必要的工作,但是我想编写一个简单的函数。如何扁平化和懒洋洋地连接列表清单

我会尝试写一个简单的例子,应该翻译成我的问题很容易:

(defn numbers 
    ([] (numbers 1)) 
    ([n] (cons n (lazy-seq (numbers (inc n)))))) 

(defn repeat-n [n] 
    (take n (repeat n))) 

所以,我们有两个功能。一个返回一个懒惰的数字序列。另一个返回它的数字参数n次(希望它也是懒惰的;如果不是这样,编写一个会很容易)。

我想将repeat-n映射到数字,以便返回懒惰的结果序列。我用lazy-seq,lazy-cat,concat和递归函数玩了一下,但是我仍然遇到了问题。

函数应该是这样的

(lazy-concat-map [f items] ...) 

和(希望)呼叫

的结果
(take 11 (lazy-concat-map repeat-n numbers)) 

12233344445 

任何想法?

回答

4
(take 11 (mapcat #(repeat % %) (range))) 
;=> (1 2 2 3 3 3 4 4 4 4 5) 

功能mapconcat(和组合mapcat),以及repeatrange都是懒惰。

列表理解,for,也懒

(take 11 (apply concat (for [x (range)] (repeat x x)))) 
;=> (1 2 2 3 3 3 4 4 4 4 5) 
+2

注意'for'可以帮助摆脱'适用concat':'(对于[X(范围)N(重复XX)] n)的' 。 – kotarak