Scheme 在Racket中编写一个函数作为参数

Scheme 在Racket中编写一个函数作为参数,scheme,racket,Scheme,Racket,这是一个hw赋值,要求我编写一个scheme函数,该函数以一个函数(具有两个参数)和一个列表作为参数,然后返回一个列表,其中列表中的每个连续元素对都被应用于这两个元素的函数值替换 例如-如果列表的元素数为奇数,则忽略最后一个元素。例如,(apply to pairs(lambda(xy)(+xy))'(3958247))应该返回(12136) 到目前为止,我得到的是: (define (fn-name fn l) (if (null? (cdr l))null (cons

这是一个hw赋值,要求我编写一个scheme函数,该函数以一个函数(具有两个参数)和一个列表作为参数,然后返回一个列表,其中列表中的每个连续元素对都被应用于这两个元素的函数值替换

例如-如果列表的元素数为奇数,则忽略最后一个元素。例如,(apply to pairs(lambda(xy)(+xy))'(3958247))应该返回(12136)

到目前为止,我得到的是:

(define (fn-name fn l)
  (if (null? (cdr l))null
      (cons 
        (fn((car l)(car (cdr l)))
         (fn-name fn (cdr l))))))
但是,我在Racket(DrRacket)中遇到了这个错误:


。。。它突出显示了
fn((carlst)(car(cdrlst))
。我试图找出如何处理函数参数。谢谢你的帮助

正如您之前所做的那样,您只需应用
fn
,就像您应用
+
这样的原语一样。但是,在
(car-lst)
(car(cdr-lst))
周围有额外的括号,这意味着您希望第一个元素也是您调用的过程,第二个元素是唯一的参数,然后
fn
只得到一个参数(如果3、5或2恰好是过程,则结果)也许你想要的是
(fn(carlst)(cadrlst))
(我用shothand来表示car+cdr)

您的基本案例应该同时检查
l
(cdr l)
是否为空,因为如果其中一个是空的,您就被取消了。(试着用
(fn name+'(5))
调用它)。您可以使用特殊的表单
来完成类似
(或test1test2)

还要注意,
null
通常不是Scheme中的绑定符号。您要么需要定义它
(定义null'())
,要么使用
'()

编辑关于太多的结果


请注意,当您使用列表的前两个元素应用第一轮时,除了第一个元素外,您使用从列表开始的新l递归。。这意味着您将在下一次迭代中处理
9
5
,而不是
5
8
。要解决这个问题,您需要使用
cddr
(cdr+cdr),而不仅仅是
cdr

我把它打印出来(12141310611),问题在于我的括号,看起来它正在适当地调整值,只是现在返回的值太多了。应该是(12 13 6)。我不知道如何处理这个…事实上,我得到了它,在底部钉上了另一个cdr,它工作了。谢谢@那太好了。习惯需要一点时间,但一旦你明白你可以做
(define(abs x)((if(
你会喜欢它带来的力量,它让你今天犯了这些错误。而且,即使在你开始欣赏它的力量之前,你至少会知道错误“application:not a procedure”通常意味着你有额外的父母谷歌搜索会发现很多结果,可以为你解释这一点:你有额外的父母<代码>(fn((汽车l)(汽车cdr l)))应该是
(fn(汽车l)(汽车cdr l))
。通常,当遇到错误时,最好搜索准确的错误消息
application: not a procedure;
 expected a procedure that can be applied to arguments
  given: 3
  arguments...:
   9