球拍代码:高阶函数

时间:2017-02-15 10:48:21

标签: dictionary lambda racket higher-order-functions

我正在尝试在我的Racket代码中实现更高级别的功能,特别是关于此功能:

(define (indivisible e L)
  (map (remove 0 ((map ((lambda (x y) (modulo x y))) L e)))))

基本上,我正在尝试从列表中删除所有可被e整除的元素。但是,它一直给我一个错误,说“预期的参数数量与给定的数字不匹配(0 vs 2)”。为什么会这样?

1 个答案:

答案 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的谓词,并且您已完成。