Clojure 如何懒洋洋地迭代mapcat

Clojure 如何懒洋洋地迭代mapcat,clojure,Clojure,我想对输入重复执行mapcat操作。例如: (->> input (mapcat my-fn) (mapcat my-fn) (mapcat my-fn) (...)) 有没有办法做到这一点 我试过了 (->> input (iterate #(mapcat my-fn %))) 但这并不能保持一个扁平的结构。我做了一个人为的例子,我们想要反转一个数字列表,然后对它们进行一些数学运算,生成一个单一的列表: user&g

我想对输入重复执行
mapcat
操作。例如:

(->> input
     (mapcat my-fn)
     (mapcat my-fn)
     (mapcat my-fn)
     (...))
有没有办法做到这一点

我试过了

(->> input
     (iterate #(mapcat my-fn %)))

但这并不能保持一个扁平的结构。

我做了一个人为的例子,我们想要反转一个数字列表,然后对它们进行一些数学运算,生成一个单一的列表:

user> (def my-funs [reverse #(map inc %)])
#'user/my-funs

user> (reduce (fn [answer-so-far next-function]
                (mapcat next-function answer-so-far))
              [[[1 1 1] [2 2 2] [3 3 3]]
               [[2 2 2] [3 3 3] [4 4 4]]]
              my-funs)
(4 4 4 3 3 3 2 2 2 5 5 5 4 4 4 3 3 3)
reduce函数从列表的初始列表开始,然后将第一个函数应用于列表列表以生成到目前为止的答案,然后将第二个函数应用于到目前为止的答案以生成下一个答案。如果您想使用更多功能,可以根据需要多次继续此操作


我怀疑这不会使代码看起来更吸引人。

我做了一个人为的例子,我们想反转一个数字列表,然后对它们进行一些计算,生成一个单一的列表:

user> (def my-funs [reverse #(map inc %)])
#'user/my-funs

user> (reduce (fn [answer-so-far next-function]
                (mapcat next-function answer-so-far))
              [[[1 1 1] [2 2 2] [3 3 3]]
               [[2 2 2] [3 3 3] [4 4 4]]]
              my-funs)
(4 4 4 3 3 3 2 2 2 5 5 5 4 4 4 3 3 3)
reduce函数从列表的初始列表开始,然后将第一个函数应用于列表列表以生成到目前为止的答案,然后将第二个函数应用于到目前为止的答案以生成下一个答案。如果您想使用更多功能,可以根据需要多次继续此操作

我怀疑这不会使代码看起来更有吸引力。

应该可以:

(->> input
     (iterate #(mapcat my-fn %))
     flatten)
应:

(->> input
     (iterate #(mapcat my-fn %))
     flatten)

你能举一个所需输入/输出的例子吗?@AlanThompson我会在工作后创建示例输入。谢谢。你能举一个所需输入/输出的例子吗?@AlanThompson我会在下班后创建示例输入。谢谢。展平压扁所有层,而不仅仅是连接序列。因此,它将失败于
[[1 2 3][[1 2 3]7 8]]]
最初的问题是要求一个扁平结构。如果只需要一级连接,请使用“apply concat”。注意:两个函数都将返回延迟序列。展平压扁所有层,而不仅仅是串联序列。因此,它将失败于
[[1 2 3][[1 2 3]7 8]]]
最初的问题是要求一个扁平结构。如果只需要一级连接,请使用“apply concat”。注意:这两个函数都将返回惰性序列。