Racket中的部分功能应用

时间:2013-11-07 05:08:55

标签: racket

我正在编写一个函数来将参数部分应用于函数,例如

(define mapeven (partial-apply map even?))
(mapeven (list 1 2 3 4)) ; '(#f #t #f #t)

为此,我有

(define (partial-apply* func . args)
  (define (apply-one func arg)
    (λ args (apply func (cons arg args))))
  (foldl (λ (new carry) (apply-one carry new)) func args))

似乎工作正常。但是,我也希望能够“跳过”args(可能是通过使用哨兵值,比如'λ)。即:

(define apply-to-four (partial-apply map 'λ (list 1 2 3 4))
(apply-to-four even?) ; '(#f #t #f #t)

也就是说,当部分应用遇到'λ时,它不会将值绑定到该位置,而是将其作为自由变量。当一个部分应用的函数被调用时,首先它将填充这个'λ机制跳过的参数,然后它会将任何剩余的参数应用到结尾。

为此,我写了:

(define (partial-apply func . args)
  (define (apply-one func arg)
    (if (equal? arg 'λ)
        (λ args (λ (x) (apply func (cons x args)))))
        (λ args (apply func (cons arg args)))))
  (foldl (λ (new carry) (apply-one carry new)) func args))

然而,它不起作用。

> (define apply-to-4 (partial-apply map 'λ (list 1 2 3 4)))
> (apply-to-4 even?)
#<procedure>

看起来这个问题出现在if语句的肯定分支中,但我无法确定它。有什么建议吗?

0 个答案:

没有答案