让我们说我想做以下事情:
(define (foo lst x)
(filter function lst)
但是function
接受2个参数(并且function
已经提供给我),一个是它将使用的列表lst
,另一个是x
。从语法上讲,如何更改该行以传递第二个参数?对不起,我是Scheme / DrRacket的新手。
答案 0 :(得分:2)
尝试使用curry
:
(define (foo lst x)
(filter (curry function x) lst))
也就是说,假设function
作为第一个参数x
而第二个参数作为lst
中的每个元素。换句话说,上述内容相当于:
(define (foo lst x)
(filter (lambda (e) (function x e))
lst))
无论哪种方式:技巧(称为currying)是创建一个接收单个参数的新函数,并将其传递给原始函数,该函数使用给定的x
修复另一个参数值。
在你的问题中,我们不清楚我们应该通过论证的顺序,但是一旦你理解了这里的基本原则,你就能弄明白。
答案 1 :(得分:0)
最简单的是:
(define (foo ys x)
(filter (λ (y) (function y x)) ys)
替代方案:
(define (foo ys x)
(for/list ; collect results into a list
([y ys]] ; for each element y in the list ys
#:when (function y x)) ; when (function y x) collect
x)) x
或者没有评论:
(define (foo ys x)
(for/list ([y ys]] #:when (function y x))
x)))