如何使用2个参数(foldl-1 proc xs)编写左折函数?这不起作用:
(define (my-fold-left op xs)
(define (func proc start xs)
(let ((start xs))
(set! start (car xs))
(if (null? xs) start
(func op (op start (car xs)) (cdr xs))))))
答案 0 :(得分:1)
您的代码没有意义......为什么在这里使用set!
?结果的初始值是多少?如果你不打算调用,为什么要定义函数func
?要实现典型的3-arg fold-left
尝试这样的事情,注意fold-left
的主要优点是它是尾递归,并且我们使用参数来累积结果:
(define (fold-left op ini xs)
(let loop ((acc ini) (lst xs))
(if (null? lst)
acc
(loop (op (car lst) acc) (cdr lst)))))
如果您确实需要fold-left
的2-arg版本,请删除ini
参数,并在第二行的开头设置acc
的默认值。请注意,通过执行此操作,您将限制此过程的有用性,以仅返回固定类型的结果,具体取决于您选择的初始值。