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 演算路线并使用定点组合器。
我一直在尝试将普通函数转换为执行相同操作的高阶函数。该函数应该将运算符作为参数,然后将该运算符应用于列表中的每个元素。例如,如果我选择运算符“+”,它将 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 演算路线并使用定点组合器。