2016-08-17 4 views
0
(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))) 

위의 코드는 Scheme의 SICP 코드 스 니펫입니다. 왜 플랫 맵 절차가 필요합니까? flatmap과 map의 차이점은 무엇입니까?SICP에서 flatmap의 중요성은 무엇입니까?

답변

3

(map proc seq)seqproc을 적용하여 각 요소에 대해 하나의 값을 반환합니다. 이러한 각 값은 다른 시퀀스 일 수 있습니다.

(accumulate append nil seq)seq의 요소 사본을 모두 새 목록으로 연결하는 데 append을 사용합니다.

따라서 flatmapseq의 모든 요소들에 적용 proc, 새로운 모든 결과 목록 평탄화 생성한다. 개념적으로, map은 각 요소에 대해 하나의 값을 생성하고, flatmap은 복수 또는 없음 (Chris에게 감사함)을 생성 할 수 있다는 점에서 mapflatmap의 차이 (Java, Scala 등)도 다릅니다. 예를 들어, 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") 
+0

"... flatmap 여러 생산할 수있는 반면"원래 포스터의 이익을 위해, flatmap 또한, 요소의 값을 생성 할 수 없다 매핑 절차를 반환하는 경우 '(). 플랫 맵을 사용하여 필터를 구현할 수 있습니다. –

관련 문제