2016-12-12 6 views
0

入力の上でmapcatオペレーションを繰り返し実行したいですか?例:mapcat lazilyを反復する方法

(->> input 
    (mapcat my-fn) 
    (mapcat my-fn) 
    (mapcat my-fn) 
    (...)) 

これを遅延させる方法はありますか?

私は

(->> input 
    (iterate #(mapcat my-fn %))) 

を試してみましたしかし、それはフラットな構造を保持しません。

+3

希望の入力/出力の例を示していることはできますか? –

+0

@AlanThompson作業後にサンプル入力を作成します。ありがとう。 –

答えて

2

私たちは数字のリストのリストを逆にして、単一のリストを生成するためにそれらにいくつかの数学をやりたい不自然な例作られた:reduce関数は、リストの最初のリストから始まる

user> (def my-funs [reverse #(map inc %)]) 
#'user/my-funs 

user> (reduce (fn [answer-so-far next-function] 
       (mapcat next-function answer-so-far)) 
       [[[1 1 1] [2 2 2] [3 3 3]] 
       [[2 2 2] [3 3 3] [4 4 4]]] 
       my-funs) 
(4 4 4 3 3 3 2 2 2 5 5 5 4 4 4 3 3 3) 

をそのリストのリストに最初の関数を適用してこれまでの回答を生成した後、2番目の関数を取り、これを回答に適用して次の回答を生成します。より多くの機能について考えるなら、これを何度でもやり直すことができます。

私は、コードを見るほうがはるかに魅力的ではないと考えています。

1

flattenは動作するはずです:

(->> input 
    (iterate #(mapcat my-fn %)) 
    flatten) 
+0

シーケンスを連結するのではなく、すべてのレイヤーを平滑化*します。 '' [1 2 3] [[[1 2 3] 7 8]]]] ' –

+0

で元の質問はフラットな構造を求めています。最初のレベルの連結のみが必要な場合は、 '連結を適用'を使用します。注:両方の関数は遅延シーケンスを返します。 – rmcv

関連する問題