2

我正在玩懒惰的列表,似乎无法弄清楚这一点。我想我可以通过把它写成一个可以完成所有必要的大递归函数来解决我的问题,但我想用更简单的函数来组合它。

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

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

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

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

我想以返回惰性结果序列的方式将重复 n 映射到数字。我玩过一些lazy-seq, lazy-cat,concat和递归函数,但我仍然遇到问题。

该功能应该是这样的

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

和(希望)调用的结果

(take 11 (lazy-concat-map repeat-n numbers)) 

将会

12233344445

有任何想法吗?

4

1 回答 1

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

The functions map, concat (and combination mapcat), as well as repeat and range are all lazy.

List comprehension, for, is also lazy

(take 11 (apply concat (for [x (range)] (repeat x x))))
;=> (1 2 2 3 3 3 4 4 4 4 5)
于 2013-05-29T15:37:12.337 回答