【问题标题】:Scheme/Racket filter/map multiple arguments方案/球拍过滤器/映射多个参数
【发布时间】:2015-12-20 02:17:56
【问题描述】:

假设我想做以下事情:

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

但是function 接受两个参数(function 是给我的),一个是列表lst,另一个是x。从语法上讲,我将如何更改该行以传递第二个参数?抱歉,我是 Scheme/DrRacket 的新手。

【问题讨论】:

    标签: functional-programming scheme racket map-function


    【解决方案1】:

    最简单的是:

    (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
    

    或者没有 cmets:

     (define (foo ys x)
       (for/list ([y ys]] #:when (function y x))
          x)))
    

    【讨论】:

      【解决方案2】:

      试试这个,使用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 值。

      在你的问题中,不清楚我们应该按什么顺序传递参数,但是一旦你理解了这里的基本原理,你就可以弄清楚了。

      【讨论】:

      • 谢谢!这就是我想要的。
      猜你喜欢
      • 1970-01-01
      • 2012-09-25
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多