스키마에서이 두 함수의 차이점은 무엇입니까? Dr Racket R5RS 언어를 사용하여 시뮬레이터 게임을 만들었으며 어떤 것이 더 나은지 결정할 수 없었습니다.Scheme에 대한 각각 및 맵
답변
큰 차이가 있습니다. map
은 목록의 요소에 주어진 절차를 적용한 결과가 포함 된 목록을 반환하고 for-each
은 void를 반환합니다. 당신이 계산의 결과를 필요로하고 그 절차의 부작용에 관심이 때 for-each
을 사용할 때마다
> (for-each (λ (x) (add1 x)) '(1 2 3))
> (map (λ (x) (add1 x)) '(1 2 3))
'(2 3 4)
당신은 map
사용합니다.
두 번째 중요한 차이점은 for-each
이 주어진 절차가 요소에 순서대로 적용된다는 것입니다. map
의 경우, 반환 된 목록은 원래 목록 [s]의 순서를 따르지 만 호출이 순서대로 이루어 졌다고 보장 할 수는 없습니다.
더 here
for-each
는 왼쪽에서 오른쪽 목록 요소에 지정된 함수를 평가하고,이 함수의 리턴 값을 폐기한다. 그것은 목록의 각 요소에 부작용을주기에 이상적입니다.
map
은 특정 순서없이 목록 요소에 대해 지정된 함수를 평가합니다 (대부분의 구현에서는 오른쪽에서 왼쪽 또는 왼쪽에서 오른쪽으로 사용하지만). 함수의 반환 값을 저장하여 호출자에게 반환합니다. . 목록의 각 요소에 대해 순수 기능 처리를 수행하는 데 이상적입니다.
map
의 반환 값이 사용되지 않으면 대신 for-each
을 사용하는 것이 좋습니다. 그런 식으로 함수 호출에서 반환 값을 수집하는 것을 번거롭게 할 필요가 없습니다.
은 (제외 : Clojure의에서는 map
의 리턴 값이 소정의 기능은 실현되는 요소 호출 수단 지연 시퀀스이다.)
기술적 구현 세부.
(define (for-each func lst)
(let loop ((rest lst))
(unless (null? rest)
(func (car rest))
(loop (cdr rest)))))
정말 간단하고, 보장은 왼쪽에서 오른쪽 순서 : for-each
의 단순화 한 목록 버전은 일반적으로 다음과 같이 구현됩니다. map
단순화 한 버전리스트와 대조 :
(define (map func lst)
(let recur ((rest lst))
(if (null? rest)
'()
(cons (func (car rest)) (recur (cdr rest))))))
, 함수의 인수에 대한 평가 순서는 특정되지 않는다. 따라서 (foo (bar) (baz) (qux))
과 같은 표현 인 경우 bar
, baz
및 qux
에 대한 호출은 임의의 순서로 발생할 수 있지만 foo
이 호출되기 전에 모두 완료됩니다.
이 경우 (func (car rest))
이 먼저 발생하거나 (recur (cdr rest))
이후에 발생할 수 있습니다. 어느 쪽이든 보장 할 수는 없습니다. 그렇기 때문에 사람들은 map
이 평가 주문을 보증하지 않는다고 말합니다.
- 1. Scheme에 대한 공식 문서 표준이 있습니까?
- 2. 어떤 소프트웨어가 Scheme에 쓰여졌습니까?
- 3. Scheme에 해당하는 Python 적용
- 4. Scheme에 &&가 있습니까?
- 5. 각각 자식에 대한 Mootools
- 6. Handlebars.js - 각각 및 getter
- 7. "header : location"overriding scheme에 대한 PHP/Apache 호출?
- 8. Scheme에 Eval 프로 시저 작성하기?
- 9. 각각
- 10. 각각
- 11. 각각
- 12. Scheme에 더 많은 목록을 교차 시킴
- 13. Scheme에 자동 메모 작성하기. 매크로 및 래퍼 도움말
- 14. 주어진 요소에 대한 CSS 속성 및 HTML 속성을 각각 가져옵니다.
- 15. 자바 구현 각각 및 메서드에 대한 반복 가능
- 16. scheme에 put & get procedure를 구현하는 방법은 무엇입니까?
- 17. 단일 값에 대한 맵
- 18. 하나의 키 누르기를 Scheme에 어떻게 기록합니까?
- 19. guile 또는 scheme에 정의 된 것은 무엇입니까?
- 20. 나는 XSLT에 대한-각각 어떻게 사용합니까
- 21. 각각 다른
- 22. 레이아웃 및 맵
- 23. 사이트 맵 XML 및 사이트 맵 PHP
- 24. Perlin 노이즈 및 높이 맵/비트 맵
- 25. PLT Scheme에 대한 사용자 지정 언어 모듈 작성에 대한 자습서가 있습니까?
- 26. MySQL 데이터베이스에 대한 URL 맵
- 27. 배열에 대한 재귀 호출 맵?
- 28. 구조 맵 구성에 대한 도움말
- 29. json 호출 및 루프 내에서 json 호출 및 루프로 각각
- 30. 어떻게 각각
비 -Lacket 체계에서 부작용이 있습니까? MIT-Scheme에서'for-each'는 무엇을합니까? – SeanLetendre
@SeanLetendre 제가 이해하고 있듯이 for-each의 명백한 요지는 부작용입니다. 그것이 주문이 보장되는 이유입니다. 그것은 모든 계획안에서 동일합니다. –