我很難找出一種方法來按照指定的次數來函數化函數。也就是說,我給函數一個自然數n和一個函數fun,並且它函數n次函數。例如:在計劃中編寫函數n次函數
(curry n fun)
是功能和可能的應用是:
(((((curry 4 +) 1) 2) 3) 4)
將產生10
我真的不知道如何正確地執行它。有人能幫我一下嗎?謝謝:)
我很難找出一種方法來按照指定的次數來函數化函數。也就是說,我給函數一個自然數n和一個函數fun,並且它函數n次函數。例如:在計劃中編寫函數n次函數
(curry n fun)
是功能和可能的應用是:
(((((curry 4 +) 1) 2) 3) 4)
將產生10
我真的不知道如何正確地執行它。有人能幫我一下嗎?謝謝:)
您可以通過重複調用curry
寫你自己的n-curry
過程:
(define (n-curry n func)
(let loop ([i 1] [acc func])
(if (= i n)
acc
(loop (add1 i) (curry acc)))))
如果您在拍的時候,它可以使用for/fold
迭代來表示一個簡單一點:
(define (n-curry n func)
(for/fold ([acc func])
([i (in-range (sub1 n))])
(curry acc)))
反正這樣使用它:
(((((n-curry 4 +) 1) 2) 3) 4)
=> 10
;;; 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)))))
;;;實施例:在初始的10號申請的11倍功能1+
,結果21:
((curry 11 (lambda (x) (+ x 1))) 10)