如何扁平化和懒惰地连接列表列表

时间:2013-05-29 15:13:08

标签: clojure lazy-sequences

我正在玩懒惰的列表,似乎无法解决这个问题。 我认为我可以通过将其写为一个大的递归函数来解决我的问题,这个函数可以完成所有必要的操作,但是我想用更简单的函数来构造它。

我将尝试编写一个简单的示例,该示例应该可以轻松转换为我的问题:

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

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

所以,我们有两个功能。一个人返回一个懒惰的数字序列。另一个返回它的数字参数n次(希望它也是懒惰的;如果不是,那么写一个就好了)。

我想将repeat-n映射到数字,以便返回延迟的结果序列。我使用lazy-seqlazy-catconcat和递归函数玩了一下,但我仍然遇到问题。

该功能应该是这样的

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

并且(希望)调用

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

将是

12233344445

有什么想法吗?

1 个答案:

答案 0 :(得分: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)