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

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”吗?我错过了它,还是错过了这么做的一些难题?

+0

您链接的问题有一个链接到'interleave-all',这只是'interleave'源的副本,但添加了'else'子句,'if'附加了“rest” – ClojureMostly

我同意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))))))))