【问题标题】:clojure: create a lazy-seq containing another lazy-seqclojure:创建一个包含另一个惰性序列的惰性序列
【发布时间】:2013-11-28 21:32:28
【问题描述】:

我想使用 clojure 创建一个包含另一个惰性序列的惰性序列。

我现有的数据结构是 map 的惰性序列,它看起来像这样:

({:a 1 :b 1})

现在我想把那个惰性序列放到另一个中,这样结果就是一个惰性序列的映射的惰性序列:

(({:a 1 :b 1}))

有人知道怎么做吗?任何帮助将不胜感激

问候,

【问题讨论】:

  • 您能否在最终的预期输出中添加一些步骤,我无法完全理解您的要求的意义
  • 你好七巧板。谢谢你的回复。在这一点上,我实际上不希望有任何输出。关键是还有另一个函数,它以一个 seq of seq of maps 作为参数,也就是说 (({:a 1 :b 1}))。

标签: clojure lazy-sequences


【解决方案1】:

一般来说,拥有一个包含许多惰性序列的惰性序列并没有什么特别之处,所以我不明白你真正想要的是什么。

你总是可以的

(map list '({:a 1 :b 1}))   ;; gives (({:a 1, :b 1}))

我们甚至可以验证它是否保持惰性:

(def a
  (concat
   (take 5 (repeat {:a 1 :b 2}))
   (lazy-seq
    (throw (Exception. "too eager")))))

(println (take 5 (map list a))) ;; works fine
(println (take 6 (map list a))) ;; throws an exception

【讨论】:

    【解决方案2】:

    以下是创建包含地图列表的列表的示例:

    => (list (list {:a 1 :b 1}))
    (({:a 1, :b 1}))
    

    这不是懒惰,但您可以使用 lazy-seq 宏使两个列表都懒惰:

    => (lazy-seq (list (lazy-seq (list {:a 1 :b 1}))))
    

    或与->宏相同的代码:

    => (-> {:a 1 :b 1} list lazy-seq list lazy-seq)
    

    实际上,如果您将此处的列表替换为向量,您将得到相同的结果:

    => (lazy-seq [(lazy-seq [{:a 1 :b 1}])])
    (({:a 1, :b 1}))
    

    我不确定您要做什么以及为什么要让两个列表都变得懒惰。因此,如果您需要进一步的帮助,请提供更好的解释。

    【讨论】:

    • 感谢列昂尼德。你是对的,没有必要让两个列表都变得懒惰。这是我的推理错误;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2010-12-08
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多