问题描述
我试图在 Scheme 中对 4 个参数的函数进行柯里化。这就是我的 curry
函数。输出应该是 30。请帮助我使用 curry4
函数。
(define sum-of-squares
(lambda (a b c d)
(+ (* a a) (* b b) (* c c) (* d d))))
(define curry4
(lambda (a b c d)
(apply sum-of-squares (a (b (c (d)))))))
(((((curry4 sum-of-squares) 1) 2) 3) 4)
解决方法
您可以尝试以下方法:
(define (((((curry-4 func) a) b) c) d)
(func a b c d))
请注意,这是扩展它的特殊语法,例如:
(define (curry-4 func)
(λ (a)
(λ (b)
(λ (c)
(λ (d) (func a b c d))))))
我们在这里所做的是返回一个 lambda,该 lambda 返回一个 lambda ...... 返回一个 lambda,该 lambda 返回应用 func
的结果。本质上,我们一次只接受一个参数,一旦我们拥有所有参数,我们就可以返回最终值。在那之前,我们返回一个仍在等待其余参数的函数。
在 Racket 中只需使用 curry
。您可以在 DrRacket 中查看定义文件。
#lang racket
(define (f n1 n2 n3 n4)
(apply +
(map (λ (x) (expt x 2))
(list n1 n2 n3 n4))))
(((((curry f) 1) 2) 3) 4)
手工咖喱。
#lang racket
(define curry-by-hand-f
(lambda (x1)
(lambda (x2)
(lambda (x3)
(lambda (x4)
(f x1 x2 x3 x4))))))
((((curry-by-hand-f 1) 2) 3) 4)