【问题标题】:How to flatten and lazily concat a list of lists如何展平和懒惰地连接列表列表
【发布时间】:2013-05-24 22:28:55
【问题描述】:

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

我会尝试写一个简单的例子,可以很容易地转化为我的问题:

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

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

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

我想将repeat-n 映射到数字,以便返回延迟的结果序列。我已经玩过lazy-seqlazy-catconcat 和递归函数,但我仍然遇到问题。

函数应该是这样的

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

以及(希望)调用的结果

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

应该是

12233344445

有什么想法吗?

【问题讨论】:

    标签: clojure lazy-sequences


    【解决方案1】:
    (take 11 (mapcat #(repeat % %) (range)))
    ;=> (1 2 2 3 3 3 4 4 4 4 5)
    

    函数mapconcat(和组合mapcat)以及repeatrange都是惰性的。

    列表理解,for,也很懒

    (take 11 (apply concat (for [x (range)] (repeat x x))))
    ;=> (1 2 2 3 3 3 4 4 4 4 5)
    

    【讨论】:

    • 请注意for 可以帮助摆脱apply concat: (for [x (range) n (repeat x x)] n)
    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2022-01-11
    • 2013-03-15
    • 2017-04-17
    • 1970-01-01
    • 2014-05-31
    • 2010-09-26
    相关资源
    最近更新 更多