2016-09-19 7 views
3

sequenceに関する2つの関連する質問:シーケンスはトランスデューサと何をするのですか?

(def xf (comp (filter odd?) (map inc)))

  1. (into [] xf (range 10))または(into() xf (range 10))、と(sequence xf (range 10))の関係は何ですか? intoの2番目の引数として使用できるレイジーシーケンスの構文がないので、この目的のために別の関数sequenceが必要ですか? (私はsequenceは1種類または別のシーケンスにコレクションを強制する、別の、非トランスデューサの使用を持っていることを知っている。)

  2. Clojure transducers page

、上記のような sequenceの用途について、述べています

得られた配列要素を段階的に計算します。これらのシーケンスは、必要に応じて入力を徐々に消費し、中間操作を完全に実現します。この動作は、遅延シーケンスの同等の操作とは異なります。 sequenceは怠惰なシーケンスを返しません、まだトランスデューサが供給されるとsequenceのdocstringは、」言ったら、(蔵中のアイテムに変換Sのアプリケーションの怠惰なシーケンスを返すように聞こえる私に

)、....」、実際には(class (sequence xf (range 10)))clojure.lang.LazySeqを返します。私はClojureトランスデューサのページから引用した最後の文を理解していないと思います。

+0

私はそれを見つけることができませんが、私はこれが重複していることを95%確信しています。だからここにこのような質問があります。 – ClojureMostly

+1

@ClojureMostlyという質問には喜んでお答えしたいと思います。検索が難しい。多分、部分的な答えが[この質問](http://stackoverflow.com/questions/31986435/clojure-transducers-behavior/31992370#31992370)の回答に埋もれているかもしれませんが、そうであれば、どこかで私の質問に答えてください - ここで、または私が重複した質問で。他の質問への[この回答](http://stackoverflow.com/a/25656422/1455243)も関連していますが、私の2番目の質問には答えません。 – Mars

答えて

1

(sequence xform from)はからのXFormsが渡されるためにレイジー配列(RT.chunkIteratorSeq TransformerIterator 上に作成します。次の値が要求されると、からの次の値でxform(変換の構成)が呼び出されます。

この動作は、遅延シーケンスの同等の操作とは異なります。

レイジーシーケンスでの同等の操作は何でしょうか?あなたのxfを例として、 をfilter odd?から(range 10)に適用し、中間レイジーシーケンスを生成し、map incを中間レイジーシーケンスに適用して、結果として最終レイジーシーケンスを生成する。

からIReduceInitを実装していないいくつかのコレクションであるとき、私は(into to xform from)(into to (sequence xform from))に似ていると言うでしょう。

は内部(reduce (xform conj) to from)としておよび終了clojure.coreに同じ し(transduce xform conj to from)を使用します。プロトコル/ collの-減らすが呼び出されます。

(into [] (sequence xf (range 10))) 
;[2 4 6 8 10] 
(into [] xf (range 10)) 
;[2 4 6 8 10] 
(transduce xf conj [] (range 10)) 
;[2 4 6 8 10] 
(reduce (xf conj) [] (range 10)) 
;[2 4 6 8 10] 

私は少しにあなたのトランスデューサを修正:それは、各変換ステップに文字を出力するよう

(defn hof-pr 
    "Prints char c on each invocation of function f within higher order function" 
([hof f c] 
    (hof (fn [e] (print c) (f e)))) 
([hof f c coll] 
    (hof (fn [e] (print c) (f e)) coll))) 
(def map-inc-pr (partial hof-pr map inc \m)) 
(def filter-odd-pr (partial hof-pr filter odd? \f)) 
(def xf (comp (filter-odd-pr) (map-inc-pr))) 

次のようにREPLでS1作成:

(def s1 (into [] xf (range 10))) 
ffmffmffmffmffm 

S1は熱心(マッピングのフィルタリングおよびmについてfを印刷)が評価されます。 S1が再び要求されたん評価:

s1 
[2 4 6 8 10] 

のはS2を作成してみましょうしない:

(def s2 (sequence xf (range 10))) 
ffm 

のみ最初の項目S2が評価されるで。要求されたときに次の項目が評価されます。

s2 
ffmffmffmffm(2 4 6 8 10) 

また、S3、古いやり方を作成:S3が定義されているときに、何の評価を見ることができたよう

(def s3 (map-inc-pr (filter-odd-pr (range 10)))) 
s3 
ffffffffffmmmmm(2 4 6 8 10) 

を。 s3が要求された場合、10個以上の要素のフィルタリングが適用され、残りの5個の要素に対するマッピングが適用され、最終シーケンスが生成されます。

+0

美しい、ボヤン。 – Mars

関連する問題