我正在尝试在我的Racket代码中实现更高级别的功能,特别是关于此功能:
(define (indivisible e L)
(map (remove 0 ((map ((lambda (x y) (modulo x y))) L e)))))
基本上,我正在尝试从列表中删除所有可被e整除的元素。但是,它一直给我一个错误,说“预期的参数数量与给定的数字不匹配(0 vs 2)”。为什么会这样?
答案 0 :(得分:1)
有几个地方你有两套括号。除非括号是特殊形式或宏的一部分,例如。 Environment
,它代表一个应用程序。即
let
此处形式((lambda (x y) (modulo x y)))
被评估并成为一个函数。第二组括号将此函数调用为无参数。由于您有两个参数(lambda ...)
和x
并且未在您的应用程序中提供任何参数,因此它表示错误。
另一个你做同样事情的地方是y
。由于我知道(map ....)
总是计算到列表或null,因此将它称为函数map
看起来很奇怪。
如果您更熟悉algol languages之类的python,那么您所做的就像((map ...))
,您可以清楚地看到someFunc(arg1 args2)()
需要返回一个函数,因为它立即被调用然后。 Scheme中的相同内容看起来像someFunc
。
((some-func arg1 arg2))
从第二个参数列表中删除第一个参数。它不会返回一个函数,因此外部remove
不会起作用。
要解决此问题,我认为您正在寻找filter
。您只需为您不想要的元素制作一个map
的谓词,并且您已完成。