2012-11-25 63 views
3

我很難找出一種方法來按照指定的次數來函數化函數。也就是說,我給函數一個自然數n和一個函數fun,並且它函數n次函數。例如:在計劃中編寫函數n次函數

(curry n fun) 

是功能和可能的應用是:

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

將產生10

我真的不知道如何正確地執行它。有人能幫我一下嗎?謝謝:)

回答

2

您可以通過重複調用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 
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))))) 

;;;實施例:在初始的10號申請的11倍功能1+,結果21:

((curry 11 (lambda (x) (+ x 1))) 10)