我想将多个序列合并为一个惰性序列。需要注意的是,核心(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”是我刚刚错过了,还是我错过了这方面的一些难点?
答案 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))))))))