【发布时间】:2014-06-28 07:17:55
【问题描述】:
我尝试在 Scheme 中使用 with fold 来实现 map。 我引用了这个网站:[ref1]http://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours/Towards_a_Standard_Library 我对折叠的理解方式=> 左关联折叠 (foldl) 从第一个元素折叠/迭代。 (前锋) 右关联折叠 (foldr) 从最后一个元素折叠/迭代。 (向后) [Q1] 我理解正确吗?
来自ref1:foldl、foldr的实现
`1) foldl (left-associate fold)`
(define (foldl func accum lst)
(if (null? lst)
accum
(foldl func (func accum (car lst)) (cdr lst))))
2) foldr (right-associate fold)
(define (foldr func end lst)
(if (null? lst)
end
(func (car lst) (foldr func end (cdr lst)))))
[=>] 使用 fold 实现 map,ref1 也有带有 foldr 代码的 map,就是这样..
1) map implementation using foldr from ref1.
(define (map func lst)
(foldr (lambda (x y) (cons (func x) y)) '() lst))
**[Q2] map impelementation using foldl from myself**
(define (fold-map-left pr list)
(foldl
(lambda (sublist element) (cons (pr element) sublist))
'()
list)
what I get as the output...
e.g. (fold-map-left (lambda(n) (expt n n)) '(1 2 3 4))
output => (256 27 4 1): backwards
- 我知道左关联折叠折叠/向后迭代,所以它会先将最后一个放入输出...,那么我该怎么做才能以正确的顺序输出?我的代码还有什么问题吗?
【问题讨论】:
-
你期望得到的输出是什么,你实际得到的输出是什么?