2016-03-04 83 views
0

我需要編寫一個Scheme高階函數,它將兩個參數的函數作爲其參數並返回該函數的curried版本。就目前的功能而言,我瞭解到這一點:Scheme,高階函數和curried函數

(define curriedFunction (lambda (x) 
     (if (positive? x) 
      (lambda (y z) (+ x y z)) 
      (lambda (y z) (- x y z))))) 

(display ((curriedFunction -5) 4 7)) 
(display "\n") 
(display ((curriedFunction 5) 4 7)) 

如果x爲負數,它會減去x y和z。如果x是正數,則它會添加x,y和z。

在高階函數術語我明白這一點:

(display (map (lambda (x y) (* x y)) '(1 2 3) '(3 4 5))) 

第三點我理解這許多在通過功能方面在作爲參數:

(define (function0 func x y) 
     (func x y)) 

(define myFunction (lambda (x y) 
     (* x y))) 

(display (function0 myFunction 10 4)) 

在代碼的正上方,我理解函數「myFunction」也可以這樣寫:

(define (myFunction x y) 
     (* x y)) 

所以現在你知道我在Scheme編程和語法方面的位置。 現在回到編寫一個Scheme函數的高階函數的問題,該函數以兩個參數的函數作爲參數,並返回該函數的一個curried版本。我如何將這些概念連接在一起?預先感謝您,我真的很感激它。

回答

3

這裏是一個可能的解決方案:

(define (curry f) 
    (lambda (x) 
    (lambda (y) 
     (f x y)))) 

功能curry取功能f並返回一個功能與單個參數x。 函數給出其參數的值,返回另一個函數,該函數接受參數y並返回將原始函數f應用於xy的結果。所以,舉例來說,(curry +)返回+一個咖喱版本:

(((curry +) 3) 4) ; produces 7 
+0

哇,倫佐,您提供簡單的例子是真棒!我一直堅持這幾個小時,但你給了我頓悟。我無法向Renzo表示謝意! – Adam

+0

不客氣! – Renzo