2016-08-17 15 views
0
(define (accumulate op initial sequence) 
    (if (null? sequence) 
    initial 
    (op (car sequence) 
    (accumulate op initial (cdr sequence))))) 

(define (flatmap proc seq) 
    (accumulate append nil (map proc seq))) 

上記はSchemeのSICPのコードスニペットです。フラットマップ手順が必要なのはなぜですか?フラットマップとマップの違いは何ですか?SICPにおけるフラットマップの意義は何ですか?

答えて

3

(map proc seq)は、seqprocを適用し、各要素に1つの値を返します。そのような各値は別のシーケンスである可能性があります。

(accumulate append nil seq)はの要素のすべてのコピーを新しいリストに連結するためにappendを使用します。

したがって、flatmapseqのすべての要素にprocを適用し、新しいは、すべての結果とリストを平らに生成します。概念的にはmapは各要素に1つの値を生成し、flatmapは複数またはなし(Chrisに感謝します)を生成するという点で、mapflatmapの違いです(Java、Scalaなど)。例えば、Clojureの中

(map #(clojure.string/split % #"\s+") ["two birds" "with one stone"]) 
;; => (["two" "birds"] ["with" "one" "stone"]) 

(mapcat #(clojure.string/split % #"\s+") ["two birds" "with one stone"]) 
;; => ("two" "birds" "with" "one" "stone") 
+0

「... flatmapが複数生じるかもしれない」オリジナルポスターの利益のために、flatmapはまた、要素に値を生成しないかもしれマッピング戻る場合'()。フラットマップを使用してフィルタを実装できます。 –

関連する問題