我正在尝试使用Racket中的列表来完成学校问题。这是一个使用递归的简单问题,但我无法理解为什么我的代码不起作用。如果提供的项目与列表中的项目匹配,我们应该搜索列表并返回true。这就是我到目前为止所做的:
(define (containsAnywhere test list)
(cond
((null? list) '())
(equal?((car list) test))
(else(containsAnywhere (test (cdr list))))))
但是我收到以下错误:
application: not a procedure;
expected a procedure that can be applied to arguments
given: 1
arguments.:
答案 0 :(得分:2)
一些评论:
list
,这个名称的内置程序会以这种方式被遮蔽;在Scheme中,调用参数lst
代替(procedure param1 param2 ...)
,cond
内的条件都在括号中equal?
谓词的尾随?
#f
,而不是'()
这是您的代码的工作版本;在cond
内部我将条件和表达式放在单独的行上,以便代码和括号变得更清晰:
(define (containsAnywhere test lst)
(cond
((null? lst)
#f)
((equal? (car lst) test)
#t)
(else
(containsAnywhere test (cdr lst)))))
或者,我会这样编码:
(define (containsAnywhere tst lst)
(and (not (null? lst))
(or (equal? (car lst) tst)
(containsAnywhere tst (cdr lst)))))
答案 1 :(得分:0)
(test (cdr list))
在这里,您将test
应用于参数(cdr list)
,就像test
是一个函数一样,但事实并非如此。因此错误。
你的意思是(containsAnywhere test (cdr list))
,它将test
作为第一个参数传递给containsAnywhere
,将(cdr list)
传递给第二个参数。