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

これはうまくいくようです。ただし、引数を「スキップ」できるようにしたいと思います(おそらく「λ」などのセンチネル値を使用することにより)。いいえ:

(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文の肯定分岐にあるようですが、突き詰めるのに苦労しています。何かアドバイス?

4

0 に答える 0