(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个。
我想我知道curry是如何工作的,对于一个二进制函数curry,我可以这样做
(define (curry-2 f)
(lambda(x)
(lambda(y)
(f x y)))).但是我很难在n个参数上泛化curry,有什么帮助吗?
发布于 2015-01-30 12:50:34
当然,您可以使用循环。;-)下面是我的实现:
(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。)
https://stackoverflow.com/questions/28229287
复制相似问题