在 Scheme 中柯里化平方和函数

问题描述

我试图在 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)