2017-03-18 63 views
2

我正在學習函數式編程。當我讀到關於FP的lambda部分介紹時,我想到了一個問題。方案語言中的lambda語法

In Scheme the syntax for anonymous functions is the following one: 

(lambda (arg1...argn) body) 

... 

We can now easily define the compose function 

(define (compose f g) 
    (lambda (x) (f (g x)))) 

我努力去理解有關x,它不是在compose函數定義的參數列表。那麼x如何傳入?

另外,假設我們有功能g1採取參數y,z,如何撥打composecompose (f1 g1) y z?如果是這樣,那麼它不僅需要兩個函數的參數,還需要來自g1的參數。我很困惑。

+0

'x'是結果組成的參數。假設你有函數'f1'和'g1'和參數'x1',那麼你可以像這樣調用'((compose f1 g1)x1)'。 – PetSerAl

回答

2

由於

(define (compose f g) 
    (lambda (x) (f (g x)))) 

我們

   (compose + *) 

評估爲

   (lambda (x) (+ (* x))). 

也就是說,在

((compose + *) 42) 

我們得到

((compose + *) 42) 
=> ((lambda (x) (+ (* x))) 42) 
=> (+ (* 42)) 
=> (+ 42) 
=> 42 
1

首先在名字和參數周圍有一個列表是語法糖。因此,要理解它完全可以充分展開:

(define compose 
    (lambda (f g)  ; compose 
    (lambda (x)  ; body 
     (f (g x)))) 

首先通知該名compose是考慮到外lambda表達式的評估的結果,就變成了雙參數關閉。

所以,當您撥打(compose f2 f1)參數投注綁定到fg和身體表達(lambda (x) (f (g x)))進行了評估。它成爲一個參數閉包。你可以在這裏定義:

(define special-function (compose f2 f1)) 

爲了使用該功能,你需要再次調用它。從而。 (special-function 5)將與評估(f2 (f1 5))相同。使用替代規則很容易看到。

那麼爲什麼要這樣呢?好。我們有一個需要的功能,像map和代替書寫功能:

(map (lambda (x) (f2 (f1 x))) '(1 2 3 4)) 

你可以寫

(map (compose f2 f1) '(1 2 3 4)) 

基本上是完全相同的表達更容易一些。

現實世界compose函數實際上可以接受任意數量的參數,它的最後一個參數是首先應用的函數,它將決定結果函數的參數。因此在球拍中你可以這樣做:

((compose add1 add1 *) 3 7) 
; ==> 23