如何用2个arg创建fold-left?

时间:2015-10-06 18:47:29

标签: functional-programming scheme lisp

如何使用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))))))

1 个答案:

答案 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的默认值。请注意,通过执行此操作,您将限制此过程的有用性,以仅返回固定类型的结果,具体取决于您选择的初始值。