Scheme - 如何循环匿名函数?

Scheme - How do I loop an anonymous function?

我一直在尝试将普通函数转换为执行相同操作的高阶函数。该函数应该将运算符作为参数,然后将该运算符应用于列表中的每个元素。例如,如果我选择运算符“+”,它将 return 列表中所有元素的总和。

普通版函数:

(define (accumulate proc id lst)
  (cond ((null? lst) id)
    ((eqv? (cdr lst) '()) (car lst))
    (else (proc (car lst) (accumulate proc id (cdr lst))))))

函数的高阶版本(不完整):

(define (acc-proc proc id)
(lambda (lst)
(cond ((null? lst) id)
      ((null? (cdr lst)) (car lst))
      (else 

在普通函数中,我使用递归调用来循环它,但我无法循环高阶函数,因为它没有 lst 作为参数。相反,参数 lst 在匿名 lambda 过程中。

我是 Scheme 的新手,如果我的解决方案不好,请原谅我。也许有更好的方法可以在不循环的情况下执行此操作?我不知道该在 else 语句中放入什么...

请注意,您的原始函数中存在错误:您的第二种情况意味着您忽略了 id 除了空列表之外的所有内容:

> (accumulate + 34 '(1 2 3))
6
> (accumulate + 34 '())
34

你只需要两个案例;空列表和非空列表。

针对实际问题:如果"anonymous"部分不是必须的,可以使用局部命名函数:

(define (acc-proc proc id)
  (define (recurse lst)
    (if (null? lst)
        id
        (proc (car lst) (recurse (cdr lst)))))
  recurse)

如果匿名性很重要,您需要采用 lambda 演算路线并使用定点组合器。