【发布时间】:2017-02-10 17:32:38
【问题描述】:
我在球拍中展示了foldr 的两个幼稚实现
第一个缺少适当的尾调用,并且对于较大的 xs 值存在问题
(define (foldr1 f y xs)
(if (empty? xs)
y
(f (car xs) (foldr1 f y (cdr xs)))))
(foldr1 list 0 '(1 2 3))
; => (1 (2 (3 0))
第二个使用带有延续的辅助函数来实现正确的尾调用,使其可以安全地用于 xs 的大值
(define (foldr2 f y xs)
(define (aux k xs)
(if (empty? xs)
(k y)
(aux (lambda (rest) (k (f (car xs) rest))) (cdr xs))))
(aux identity xs))
(foldr2 list 0 '(1 2 3))
; => (1 (2 (3 0)))
看racket/control我看到球拍支持一流的延续。我想知道使用shift 和reset 来表达foldr 的第二个实现是否可能/有益。我玩了一会儿,结果我的大脑就彻底翻了。
请提供详尽的解释以及任何答案。我在这里寻求大局的理解。
【问题讨论】:
-
第一个看起来和球拍中提供的一样。如果球拍不需要复杂化,你为什么需要?
-
@Sylwester 我不想专注于
foldr本身,而是更多地关注如何使用不同的技术通过适当的尾调用来表达过程。我只是以foldr为例。
标签: functional-programming racket continuations delimited-continuations