3

関数を指定された回数カリー化する方法がわかりません。つまり、関数に自然数 n と関数 fun を与え、関数を n 回カリー化します。例えば:

(curry n fun)

関数であり、可能なアプリケーションは次のとおりです。

(((((curry 4 +) 1) 2) 3) 4)

これは10を生成します。

適切に実装する方法が本当にわかりません。誰か手を貸してくれませんか?ありがとう :)

4

2 に答える 2

2

n-curryを繰り返し呼び出すことで、独自のプロシージャを作成できますcurry

(define (n-curry n func)
  (let loop ([i 1] [acc func])
    (if (= i n)
        acc
        (loop (add1 i) (curry acc)))))

for/foldRacket を使用している場合は、反復を使用して少し簡単に表現できます。

(define (n-curry n func)
  (for/fold ([acc func])
    ([i (in-range (sub1 n))])
    (curry acc)))

とにかく、次のように使用します。

(((((n-curry 4 +) 1) 2) 3) 4)
=> 10
于 2012-11-25T16:16:05.720 に答える
2
;;; no curry
;;; (Int, Int, Int) => Int

(define sum
  (lambda (x y z)
    (+ x y z) ) )

(sum 1 2 3)

;;; curry once
;;; (Int) => ((Int x Int) => Int)

(define sum
  (lambda (x)
    (lambda (y z)
      (+ x y z) ) ) )

(define sum+10 (sum 10))

(sum+10 10 20)

;;; curry 2 times
;;; (Int) => (Int => (Int => Int) )

(define sum
  (lambda (x)
    (lambda (y)
      (lambda (z)
        (+ x y z) ) ) ) )

(define sum+10+20 ((sum 10) 20))

(sum+10+20 30)

;;; 次に、これらの例から始めて一般化します。

(define (curry n f)
  (if (= n 0)
      (lambda (x) x)
      (lambda (x) (f ((curry (- n 1) f) x)))))

;;;例:1+最初の数値 10 に関数を 11 回適用すると、結果は 21 になります。

((curry 11 (lambda (x) (+ x 1))) 10)
于 2012-11-26T15:44:38.107 に答える