【问题标题】:Racket Code: Higher-Order Functions球拍代码:高阶函数
【发布时间】:2017-02-15 19:02:00
【问题描述】:
我正在尝试在我的 Racket 代码中实现更高级别的功能,特别是关于这个功能:
(define (indivisible e L)
(map (remove 0 ((map ((lambda (x y) (modulo x y))) L e)))))
基本上,我试图从列表中删除所有可被 e 整除的元素。但是,它一直给我一个错误,说“预期的参数数量与给定的数量不匹配(0 vs 2)”。为什么会这样?
【问题讨论】:
标签:
dictionary
lambda
racket
higher-order-functions
【解决方案1】:
有几个地方有两组括号。除非括号是特殊形式或宏的一部分,例如。 let,它代表一个应用程序。即。
((lambda (x y) (modulo x y)))
这里(lambda ...) 的形式被评估并成为一个函数。第二组括号无参数调用此函数。由于您有两个参数,x 和 y,并且在您的应用程序中没有提供任何参数,它表示一个错误。
您可以在(map ....) 附近做同样的事情。因为我知道map 总是计算为一个列表或空值,所以将它称为函数((map ...)) 看起来有点奇怪。
如果您更熟悉algol languages 之类的python,那么您所做的就像someFunc(arg1 args2)() 一样,您清楚地看到someFunc 需要返回一个函数wince,然后它会立即被调用。 Scheme中的相同看起来像((some-func arg1 arg2))。
remove 从第二个参数列表中删除第一个参数。它不返回函数,因此外部 map 将不起作用。
为了解决这个问题,我认为您正在寻找filter。您只需要为您不想要的元素创建一个谓词#f,然后就完成了。