2015-07-10 47 views
1

我想將多個序列合併爲一個惰性序列。需要注意的是,核心(地圖,交錯等)中的所有機制似乎都不會考慮這些序列具有多個長度。我看過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

回答

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

我不知道標準庫中有這樣的函數。

這並不難寫,但:

(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))))))))