Scheme - 如何循环匿名函数?

时间:2016-10-12 13:49:16

标签: function loops scheme higher-order-functions anonymous

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

正常版功能:

(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新手,如果我的解决方案不好,请原谅我。也许有更好的方法来做到这一点没有循环?我不知道该在其他声明中加入什么......

1 个答案:

答案 0 :(得分:1)

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

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

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

对于实际问题:如果“匿名”部分不是必需的,则可以使用本地命名函数:

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

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