Clojure 如何将列表展平并懒洋洋地压缩
我在玩弄懒惰的列表,似乎无法弄清楚这一点。 我想我可以通过把它写成一个大的递归函数来解决我的问题,它可以完成所有必要的工作,但是我想把它写成更简单的函数 我将尝试写一个简单的例子,可以很容易地解释我的问题:Clojure 如何将列表展平并懒洋洋地压缩,clojure,lazy-sequences,Clojure,Lazy Sequences,我在玩弄懒惰的列表,似乎无法弄清楚这一点。 我想我可以通过把它写成一个大的递归函数来解决我的问题,它可以完成所有必要的工作,但是我想把它写成更简单的函数 我将尝试写一个简单的例子,可以很容易地解释我的问题: (defn numbers ([] (numbers 1)) ([n] (cons n (lazy-seq (numbers (inc n)))))) (defn repeat-n [n] (take n (repeat n))) 我们有两个函数。返回一个惰性的数字序列。另
(defn numbers
([] (numbers 1))
([n] (cons n (lazy-seq (numbers (inc n))))))
(defn repeat-n [n]
(take n (repeat n)))
我们有两个函数。返回一个惰性的数字序列。另一个返回其number参数n次(希望它也是懒惰的;如果不是,那么编写一个这样的参数似乎很容易)
我想将repeat-n映射到数字,以便返回结果的惰性序列。我已经使用了lazy-seq
、lazy-cat
、concat
和递归函数,但仍然存在一些问题
函数应该是这样的
(lazy-concat-map [f items] ...)
以及(希望)打电话的结果
(take 11 (lazy-concat-map repeat-n numbers))
会是
12233344445
有什么想法吗
(take 11 (mapcat #(repeat % %) (range)))
;=> (1 2 2 3 3 3 4 4 4 4 5)
函数map
,concat
(和组合mapcat
),以及repeat
和range
都是惰性的
列表理解,对于,也是懒惰的
(take 11 (apply concat (for [x (range)] (repeat x x))))
;=> (1 2 2 3 3 3 4 4 4 4 5)
函数map
,concat
(和组合mapcat
),以及repeat
和range
都是惰性的
列表理解,对于,也是懒惰的
(take 11 (apply concat (for [x (range)] (repeat x x))))
;=> (1 2 2 3 3 3 4 4 4 4 5)
注意,
for
可以帮助摆脱应用concat
:(对于[x(范围)n(重复x x)]n)
。注意,for
可以帮助摆脱应用concat
:(对于[x(范围)n(重复x x)]n)
。