Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme “平面地图”在SICP中的意义是什么?_Scheme_Sicp_Map Function_Flatmap - Fatal编程技术网

Scheme “平面地图”在SICP中的意义是什么?

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为

以上是来自SICP的代码片段,在Scheme中。为什么需要
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")