如何使用 2 个参数创建左折叠?

How create fold-left with 2 arg?

如何编写一个带有 2 个参数的 fold-left 函数 (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))))))

您的代码没有意义...为什么要在这里使用 set!?结果的初始值是多少?如果您不打算 调用 函数,为什么还要定义函数 func?要实现一个典型的 3-arg fold-left 尝试这样的事情,注意到 fold-left 的主要优点是它是 tail-recursive,我们使用一个参数用于累积结果:

(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 的双参数版本,请删除 ini 参数并在第二行的开头为 acc 设置默认值。请注意,通过这样做,您将此过程的用途限制为 return 仅固定类型的结果,具体取决于您选择的初始值。