Scheme / Racket过滤/映射多个参数

时间:2015-09-22 22:36:43

标签: functional-programming scheme racket map-function

让我们说我想做以下事情:

(define (foo lst x)
   (filter function lst)

但是function接受2个参数(并且function已经提供给我),一个是它将使用的列表lst,另一个是x。从语法上讲,如何更改该行以传递第二个参数?对不起,我是Scheme / DrRacket的新手。

2 个答案:

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