Scheme “平面地图”在SICP中的意义是什么?
以上是来自SICP的代码片段,在Scheme中。为什么需要Scheme “平面地图”在SICP中的意义是什么?,scheme,sicp,map-function,flatmap,Scheme,Sicp,Map Function,Flatmap,以上是来自SICP的代码片段,在Scheme中。为什么需要flatmap过程?flatmap和map之间有什么区别?(map proc seq)将proc应用于序列seq,为每个元素返回一个值。每个这样的值都可能是另一个序列 (累计追加nil seq)将使用append将seq中元素的所有副本连接到一个新列表中 因此,flatmap将proc应用于seq的所有元素,并生成一个包含所有结果的新的展平列表。从概念上讲,这是其他语言(Java、Scala等)中map和flatmap的区别,因为map为
flatmap
过程?flatmap
和map
之间有什么区别?(map proc seq)
将proc
应用于序列seq
,为每个元素返回一个值。每个这样的值都可能是另一个序列
(累计追加nil seq)
将使用append
将seq
中元素的所有副本连接到一个新列表中
因此,flatmap
将proc
应用于seq
的所有元素,并生成一个包含所有结果的新的展平列表。从概念上讲,这是其他语言(Java、Scala等)中map
和flatmap
的区别,因为map
为每个元素生成一个值,而flatmap
可能生成多个值或无值(感谢Chris)
例如,在Clojure中:
(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)))
“…虽然flatmap可能会产生多个”:为了原始海报的利益,如果映射过程返回“()”,flatmap也可能不会为元素产生任何值。可以使用flatmap实现过滤器。
(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")