我正在玩懒惰的列表,似乎无法解决这个问题。 我认为我可以通过将其写为一个大的递归函数来解决我的问题,这个函数可以完成所有必要的操作,但是我想用更简单的函数来构造它。
我将尝试编写一个简单的示例,该示例应该可以轻松转换为我的问题:
(defn numbers
([] (numbers 1))
([n] (cons n (lazy-seq (numbers (inc n))))))
(defn repeat-n [n]
(take n (repeat n)))
所以,我们有两个功能。一个人返回一个懒惰的数字序列。另一个返回它的数字参数n次(希望它也是懒惰的;如果不是,那么写一个就好了)。
我想将repeat-n映射到数字,以便返回延迟的结果序列。我使用lazy-seq
,lazy-cat
,concat
和递归函数玩了一下,但我仍然遇到问题。
该功能应该是这样的
(lazy-concat-map [f items] ...)
并且(希望)调用
的结果(take 11 (lazy-concat-map repeat-n numbers))
将是
12233344445
有什么想法吗?
答案 0 :(得分:4)
(take 11 (mapcat #(repeat % %) (range)))
;=> (1 2 2 3 3 3 4 4 4 4 5)
函数map
,concat
(以及mapcat
}组合,以及repeat
和range
都是懒惰的。
列表理解for
也是懒惰的
(take 11 (apply concat (for [x (range)] (repeat x x))))
;=> (1 2 2 3 3 3 4 4 4 4 5)