1

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

(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(可能通过使用标记值,例如 'λ)。IE:

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

也就是说,当 partial-apply 遇到 'λ 时,它不会将值绑定到该位置,而是将其保留为自由变量。并且当一个部分应用的函数被调用时,它首先会填充被 'λ 机制跳过的参数,然后它会将所有剩余的参数应用到末尾。

为此,我写了:

(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 语句的肯定分支中,但我无法确定它。有什么建议吗?

4

0 回答 0