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))

也就是说,假设 functionx 作为第一个参数,将 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)))