저는 함수 프로그래밍을 가르쳐 왔으며 현재 접기를 사용하여 다른 고차 함수를 작성하고 있습니다. 나는 (또한 접두사 합계로 알려진) 스캔을 구현하는 붙어있어.함수 프로그래밍 - 접기를 사용하여 스캔 (접두사 합계) 구현
이(define (map op sequence)
(fold-right (lambda (x l) (cons (op x) l)) nil sequence))
그리고 검사에서 내 샷은 다음과 같습니다 :
이(define (scan sequence)
(fold-left (lambda (x y) (append x (list (+ y (car (reverse x)))))) (list 0) sequence))
나의 관찰은 "x"는 "Y"지금까지 결과 배열되고 해당되는이 같은 배를 사용하여 내지도 구현이 보인다 입력리스트의 다음의 요소 이 결과는 다음과 같습니다.
(scan (list 1 4 8 3 7 9)) -> (0 1 5 13 16 23 32)
그러나이 결과는 람다 내부에서 진행되는 결과 목록의 반전과 함께 꽤보기 흉한 것처럼 보입니다. 나는 다음 결과가 많은 것을 병렬화하려고 시도 할 때부터 결과 목록에서 전역 연산을하지 않는 편이 더 낫다고 생각한다 (이것은 다른 이야기이다. 나는 여러 가지 CUDA 논문을보고있다).
아무에게도 더 세련된 해결책이 있습니까?
BTW 배 왼쪽과 배 오른쪽의 내 구현은 : 나는이 작업을 수행하지 않을
(define (fold-left op initial sequence)
(define (iter result rest)
(if (null? rest)
result
(iter (op result (car rest)) (cdr rest))))
(iter initial sequence))
(define (fold-right op initial sequence)
(if (null? sequence)
initial
(op (car sequence) (fold-right op initial (cdr sequence)))))
신난다, 그것이 내가 찾고 있었던 정확하게 것이다. –