(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)))
以上是来自SICP的代码片段,在Scheme中。为什么需要flatmap程序? flatmap和map有什么区别?
答案 0 :(得分:4)
(map proc seq)
会将proc
应用于序列seq
,为每个元素返回一个值。每个这样的值都可能是另一个序列。
(accumulate append nil seq)
将使用append
将seq
中所有元素的副本连接到一个新列表中。
因此,flatmap
会将proc
应用于seq
的所有元素,并生成包含所有结果的新展平列表。从概念上讲,这也是map
和flatmap
在其他语言(Java,Scala等)中的区别,因为map
为每个元素生成一个值,而{{1可能产生多个或没有(感谢克里斯)。
例如,在Clojure中:
flatmap