Scheme/Racket filter/map 多个参数
Scheme/Racket filter/map multiple arguments
假设我想执行以下操作:
(define (foo lst x)
(filter function lst)
但是 function
接受 2 个参数(function
是给我的),一个是它将使用的列表 lst
,另一个是 x
.从句法上讲,我将如何更改该行以传递第二个参数?抱歉,我是 Scheme/DrRacket.
的新手
试试这个,使用 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
值。
在你的问题中,不清楚我们应该以何种顺序传递参数,但一旦你理解了这里的基本原理,你就会明白。
最简单的是:
(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)))
假设我想执行以下操作:
(define (foo lst x)
(filter function lst)
但是 function
接受 2 个参数(function
是给我的),一个是它将使用的列表 lst
,另一个是 x
.从句法上讲,我将如何更改该行以传递第二个参数?抱歉,我是 Scheme/DrRacket.
试试这个,使用 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
值。
在你的问题中,不清楚我们应该以何种顺序传递参数,但一旦你理解了这里的基本原理,你就会明白。
最简单的是:
(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)))