2015-01-30 2 views
0
(curry-n f n) 

F: функция, которая принимает аргументы п
п: положительное целое число> = 2
, например, скажемКарри функция с п аргументов

(define (add2 a b c d) (+ 2 a b c d)) 
(define func (curry-n add2 4)) 
((((func 1) 2) 3) 4) 

должен производить 12.

Я думаю, что я понимаю, как работает карри, для двоичной функции карри Я могу сделать что-то вроде

(define (curry-2 f) 
(lambda(x) 
    (lambda(y) 
    (f x y)))). 

но у меня проблемы с обобщением карри на n аргументов, любая помощь?

ответ

3

Вы используете цикл, конечно. ;-) Вот моя реализация:

(define (curry-n f n) 
    (let loop ((n n) (args '())) 
    (if (zero? n) 
     (apply f (reverse args)) 
     (lambda (x) 
      (loop (- n 1) (cons x args)))))) 

Вот более общая реализация, что позволяет выделанные функции принимать любое количество аргументов, а не только 1:

(define (curry-n f n) 
    (let loop ((n n) (args '())) 
    (if (zero? n) 
     (apply f (reverse args)) 
     (lambda xs 
      (let retry ((rem (- n (length xs))) (xs xs)) 
      (if (negative? rem) 
       (retry 0 (take xs n)) 
       (loop rem (append-reverse xs args)))))))) 

(take и append-reverse взяты из SRFI 1.)

Смежные вопросы