2014-12-15 2 views
9

저는 Scheme을 배우려고하는데 mapapply의 차이를 이해하는 데 어려움을 겪고 있습니다.스키마와 맵의 차이점은 무엇입니까?

제가 알고 있듯이 map은 함수를 목록의 각 요소에 적용하고 apply은 프로 시저의 인수에 무언가를 적용합니다.

서로 바꾸어 사용할 수 있습니까?

답변

21

이들은 동일하지 않습니다! 그들의 이름은 실제로 무슨 일을하는지 기억할 수 있습니다.

map은 하나의 절차와 하나 이상의 목록을 인수로 취합니다. 절차는 그 위치에 인수로 요소 목록을 사용하여 목록의 각 위치에 대해 한 번 호출됩니다 :

(map - '(2 3 4)) 
; => (-2 -3 -4) 

map

목록을 구축 (- 2), (- 3), (- 4)을했다.

(map + '(1 2 3) 
     '(10 20 30)) 
; => (11 22 33) 

map는 목록을 구축 할 (+ 1 10)(+ 2 20)(+ 3 30)을했다.

(map * '(2 2 -1) 
     '(0 3 4) 
     '(5 4 2)) 
; => (0 24 -8) 

map는 목록을 구축 할 (* 2 0 5)(* 2 3 4)(* -1 4 2)를했다.

(map - '(2 3 4)) 
arguments  mapping "-"  result 
    2  === (- 2) ===>  -2 
    3  === (- 3) ===>  -3 
    4  === (- 4) ===>  -4 

(map + '(1 2 3) 
     '(10 20 30)) 
arguments  mapping "+"  result 
    1 10  === (+ 1 10) ===>  11 
    2 20  === (+ 2 20) ===>  22 
    3 30  === (+ 3 30) ===>  33 

apply적어도 두 인수를 취할 것입니다, 그 중 첫 번째 : 그것은 (목록에서) 값의 집합에 "지도"(기능)을 구현하므로

map

그 이름이 프로 시저이고 마지막으로 목록입니다.이 목록 안에 포함, 다음 인수와 함께 프로 시저를 호출합니다 :

(apply + '(2 3 4)) 
; => 9 

이 동일 (+ 2 3 4)

(apply display '("Hello, world!")) 
; does not return a value, but prints "Hello, world!" 

으로이 (display "Hello, world!")과 동일합니다. 당신이 목록으로 인수를 할 때 apply를 사용하지 않고 마지막 줄을 다시 작성하려고하면, 당신은 당신이 각 요소를 합산리스트를 반복 할 필요가 있음을 깨닫게됩니다

(define arguments '(10 50 100)) 
(apply + arguments) 

apply은 유용합니다. ..

apply은 두 개 이상의 인수와 함께 사용할 수도 있습니다. 첫 번째 인수는 호출 가능 객체 (프로 시저 또는 연속) 여야합니다. 마지막 하나는 목록이어야합니다. 첫 번째와 마지막 사이의 다른 객체는 모든 유형의 객체입니다. 이렇게

(apply PROC a b c ... y z '(one two ... twenty)) 

(PROC a b c ... y z one two ... twenty) 

여기에 구체적인 예입니다 전화와 동일하게되어 전화 :

(apply + 1 -2 3 '(10 20)) 
; => 32 

(+ 1 -2 3 10 20)

apply와 같은 이름은 수 있기 때문에 것을 가지고있다 당신은 여러 가지 논증에 절차를 "적용"합니다.

+1

스키마에서'apply'는 여러 개의 인수를 취하지 만 첫 번째는 호출 가능한 (프로 시저 또는 연속) 것이어야하며 마지막은 목록이어야합니다. 그 사이의 인수는 첫 번째 인수입니다.'(map map '((abc) (1 2 3))) => ((a 1) (b 2) (c 3))' – Sylwester

+0

@Sylwester : 나는 그 지위를 편집했다. 감사! – Jay

+1

다른 중요한 차이점은 항상지도가 목록을 반환한다는 것입니다. –

3

아니, apply 마지막 하나 개의 인수로 모든 나머지와 함께, 절차 등 자사의 첫 번째 인수를 호출 - 목록 - "슬라이스"의 내용, 즉 개방 :

(apply f a b (list c d e)) == (f a b c d e) 

예 :

(적용 + 1 (2) (3 4 5 목록))
, 값 15

그것은 단지 하나의 통화이고; map은 실제로 두 번째 인수의 각 멤버 요소에 대해 첫 번째 인수를 호출합니다.

mapapply 하나 병용 유명한 transpose 트릭 :

(지도 목록을 적용 '((1 2 3) (10 20 30)))
; 값 ((1 10) (2 20) (3 30))

관련 문제