具有多个长度序列的Clojure延迟交错或映射功能

时间:2015-07-10 12:41:36

标签: clojure functional-programming

我想将多个序列合并为一个惰性序列。需要注意的是,核心(map,interleave等)中的所有机制似乎都不能解释那些多个长度的序列。我见过this similar post,但这并不是我想要的。所以基本上,目标是具有以下特征的函数“super-fn”:

=>(defn super-fn [& rest]
    ...)
=>(apply println (super-fn [1 2 3 ] [1 2 3 4 5]))
1 1 2 2 3 3 4 5
=>nil

在不知道长度的情况下,能够合并多个这样的数据流似乎很有用。我的核心库中的“超级fn”是我刚刚错过了,还是我错过了这方面的一些难点?

2 个答案:

答案 0 :(得分:3)

我同意 bsvingen ,虽然你可以使用稍微优雅的实现:

(defn super-fn
  [& colls]
  (lazy-seq
    (when-let [ss (seq (keep seq colls))]
      (concat (map first ss)
              (apply super-fn (map rest ss))))))

它也正确处理空输入序列:

(super-fn [1 2] []) ; => (1 2)

答案 1 :(得分:1)

我不知道标准库中有这样的功能。

但写起来并不难:

(defn super-fn
  [& seq-seq]
  (when seq-seq
    (lazy-seq
     (concat (filter identity
                     (map first seq-seq))
             (apply super-fn
                    (seq
                     (filter identity
                             (map next seq-seq))))))))