Jac*_*ack 3 scheme sicp flatmap map-function
(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)))
Run Code Online (Sandbox Code Playgroud)
以上是来自 SICP 的代码片段,在 Scheme 中。为什么flatmap需要这个程序?flatmap和 和有map什么区别?
(map proc seq)将应用于proc序列seq,为每个元素返回一个值。每个这样的值可能是另一个序列。
(accumulate append nil seq)将用于append将元素的所有副本连接seq到一个新列表中。
因此,flatmap将应用于proc的所有元素seq,并生成一个包含所有结果的新扁平列表。从概念上讲,这也是其他语言(Java、Scala 等)的map和的区别,flatmap因为它map为每个元素产生一个值,而flatmap可能产生多个或没有(感谢 Chris)。
例如,在 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")
Run Code Online (Sandbox Code Playgroud)