【发布时间】:2017-01-12 15:04:16
【问题描述】:
通过连接集合创建惰性序列。
考虑以下函数:
(defn req []
(Thread/sleep 1000)
(repeat 4 (rand-int 10)))
添加睡眠是因为函数最终将是一个http请求,因此它应该模拟一个延迟。
示例输出:
(req)
;; (8 8 8 8)
(req)
;; (4 4 4 4)
我现在正在考虑一个函数,它通过串联后续req 结果创建一个惰性序列。
(take 10 (f req))
;; (3 3 3 3 2 2 2 2 9 9)
这是一种实现方式:
(defn f [g]
(lazy-seq (concat (g) (f g))))
这是要走的路吗?我以某种方式猜测可能已经有一个可用的抽象。我试过lazy-cat,但这个宏似乎只适用于固定数量的给定序列。
事实证明这是一个有效的抽象:
(take 10 (apply concat (repeatedly req)))
但是,惰性序列的分块看起来会导致req 在这里被调用的频率超过了这里所需的频率,如果它是一个 http 请求,这是不可接受的。
【问题讨论】:
-
另一种变体:(取10(map (fn [_] (req)) (range)))
-
这不起作用。它返回列表列表而不是列表。它省略了它的 concat 部分。
-
对不起--小修正:(取10(mapcat(fn [_](req))(范围)))
-
@DarrylG 这也会导致惰性序列元素的冗余实现
-
@OlegTheCat: 这里提供的示例输出是: (5 5 5 5 9 9 9 9 3 3) 这不是和问题描述一样吗?