저는 Scheme을 배우려고하는데 map
과 apply
의 차이를 이해하는 데 어려움을 겪고 있습니다.스키마와 맵의 차이점은 무엇입니까?
제가 알고 있듯이 map
은 함수를 목록의 각 요소에 적용하고 apply
은 프로 시저의 인수에 무언가를 적용합니다.
서로 바꾸어 사용할 수 있습니까?
저는 Scheme을 배우려고하는데 map
과 apply
의 차이를 이해하는 데 어려움을 겪고 있습니다.스키마와 맵의 차이점은 무엇입니까?
제가 알고 있듯이 map
은 함수를 목록의 각 요소에 적용하고 apply
은 프로 시저의 인수에 무언가를 적용합니다.
서로 바꾸어 사용할 수 있습니까?
이들은 동일하지 않습니다! 그들의 이름은 실제로 무슨 일을하는지 기억할 수 있습니다.
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
와 같은 이름은 수 있기 때문에 것을 가지고있다 당신은 여러 가지 논증에 절차를 "적용"합니다.
아니, apply
마지막 하나 개의 인수로 모든 나머지와 함께, 절차 등 자사의 첫 번째 인수를 호출 - 목록 - "슬라이스"의 내용, 즉 개방 :
(apply f a b (list c d e)) == (f a b c d e)
예 :
(적용 + 1 (2) (3 4 5 목록))
, 값 15
그것은 단지 하나의 통화이고; map
은 실제로 두 번째 인수의 각 멤버 요소에 대해 첫 번째 인수를 호출합니다.
map
및 apply
하나 병용 유명한 transpose
트릭 :
(지도 목록을 적용 '((1 2 3) (10 20 30)))
; 값 ((1 10) (2 20) (3 30))
스키마에서'apply'는 여러 개의 인수를 취하지 만 첫 번째는 호출 가능한 (프로 시저 또는 연속) 것이어야하며 마지막은 목록이어야합니다. 그 사이의 인수는 첫 번째 인수입니다.'(map map '((abc) (1 2 3))) => ((a 1) (b 2) (c 3))' – Sylwester
@Sylwester : 나는 그 지위를 편집했다. 감사! – Jay
다른 중요한 차이점은 항상지도가 목록을 반환한다는 것입니다. –