(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个参数上概括咖喱,有什么帮助吗?
答案 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))))))))
(take
和append-reverse
来自SRFI 1。)