【发布时间】:2010-02-11 10:29:51
【问题描述】:
我一直在自学函数式编程,目前正在使用折叠编写不同的高阶函数。我坚持实施扫描(也称为前缀和)。我使用折叠的地图实现如下:
(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)
但这看起来很丑陋,结果列表的反转在 lambda 内部进行。我更愿意不在结果列表上进行全局操作,因为我的下一个尝试是尝试并行化其中的大部分内容(这是一个不同的故事,我正在查看几篇 CUDA 论文)。
有人有更优雅的扫描解决方案吗?
顺便说一句,我对 fold-left 和 fold-right 的实现是:
(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)))))
【问题讨论】:
标签: functional-programming scheme