平面图在SICP中有什么意义?

时间:2016-08-17 09:30:14

标签: dictionary scheme sicp flatmap

(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有什么区别?

1 个答案:

答案 0 :(得分:4)

(map proc seq)会将proc应用于序列seq,为每个元素返回一个值。每个这样的值都可能是另一个序列。

(accumulate append nil seq)将使用appendseq中所有元素的副本连接到一个新列表中。

因此,flatmap会将proc应用于seq的所有元素,并生成包含所有结果的新展平列表。从概念上讲,这也是mapflatmap在其他语言(Java,Scala等)中的区别,因为map为每个元素生成一个值,而{{1可能产生多个或没有(感谢克里斯)。

例如,在Clojure中:

flatmap