Clojure具有多个长度序列的延迟交错或映射功能
问题描述:
我想将多个序列合并为一个惰性序列。需要注意的是,核心(地图,交错等)中的所有机制似乎都不会考虑这些序列具有多个长度。我看过this similar post,但这不完全是我要找的。所以基本上,我们的目标是一个函数“超级FN”具有这些特点:Clojure具有多个长度序列的延迟交错或映射功能
=>(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”吗?我错过了它,还是错过了这么做的一些难题?
答
我同意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)
答
我不知道标准库中有这样的函数。
这并不难写,但:
(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))))))))
您链接的问题有一个链接到'interleave-all',这只是'interleave'源的副本,但添加了'else'子句,'if'附加了“rest” – ClojureMostly