我有一个长而懒惰的序列,我想减少和懒惰地测试。一旦两个顺序元素=
(或其他谓词)彼此不存在,我就想停止使用该列表,因为该列表的生成成本很高。是的,这听起来像take-while
,但请进一步阅读。
我想写一些像这样简单而优雅的东西(假装一分钟every?
像这样reduce
):
(every? = (range 100000000))
但这并不懒惰,因此它挂在无限序列上。我发现这几乎可以按我的意愿工作:
(apply = (range 100000000))
但是,我注意到序列分块会导致创建和测试额外的、不必要的元素。至少,我认为这就是以下代码中发生的情况:
;; Displays chunking behavior in groups of four on my system and prints 1 2 3 4
(apply = (map #(do (println %) %) (iterate inc 1)))
;; This prints 0 to 31
(apply = (map #(do (println %) %) (range)))
我找到了一种解决方法,使用take-while
, 并count
检查所用元素的数量,但这相当麻烦。
我应该礼貌地向 Rich Hickey 建议他正确地进行一些组合reduce
和every?
短路,还是我错过了一些已经存在的明显方式?
编辑:两个好心人发布了避免在惰性序列上分块的解决方案,但是在执行 时如何避免分块apply
,这似乎在四个一组的分块中消耗?
编辑#2:正如 Stuart Sierra 所指出的,我独立发现,这实际上并不是分块。只是申请正常行事,所以我会称之为关闭并给他答案。对于那些感兴趣的人,我在单独的答案中包含了一个小函数来解决问题的减少部分。