咖喱函数有n个参数

时间:2015-01-30 04:34:01

标签: lambda scheme racket

(curry-n f n)

f:一个带n个参数的函数
n:正整数> = 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个参数上概括咖喱,有什么帮助吗?

1 个答案:

答案 0 :(得分: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))))))

这是一个更通用的实现,它允许curried函数接受任意数量的参数,而不仅仅是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))))))))

takeappend-reverse来自SRFI 1。)