【问题标题】: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))
也就是说,假设function 将x 作为第一个参数,将lst 中的每个元素作为第二个参数。也就是说,上面等价于这个:
(define (foo lst x)
(filter (lambda (e) (function x e))
lst))
无论哪种方式:诀窍(称为currying)是创建一个接收单个参数的新函数,并将其传递给原始函数,该函数将另一个参数固定为给定的x 值。
在你的问题中,不清楚我们应该按什么顺序传递参数,但是一旦你理解了这里的基本原理,你就可以弄清楚了。