2013-10-27 86 views
1

我得到這個什麼是lambda的要點?

(define (ident x) x) 

相同

(define ident (lambda (x) x)) 

但是,爲什麼使用拉姆達時,你可以簡單地使用以前在這裏?這看起來不是更簡單嗎?

回答

2

是的,通常你會定義一個函數,並給它起名字時使用簡寫。

有時候定義一個函數可以立即使用,並且不需要名稱。人們經常稱這些「匿名功能」。當你不需要需要它有一個名字,很高興不被強迫提供一個。

例如,假設您想要將2添加到列表中的每個項目。您可以使用map對於這一點,它提供的功能,增加了2.你可以寫:

(define (add-2 x) 
    (+ x 2)) 

(map add-2 
    (list 1 2 3)) 

但是如果你只需要add-2東西這一次,而不是你可以簡單地寫:

(map (lambda (x) (+ x 2)) 
    (list 1 2 3)) 

通過你也可以使用curry來寫這個的辦法:

(map (curry + 2) 
    (list 1 2 3)) 

curry是創建一個函數的函數。在Scheme和Racket等語言中,使用這種「高階函數」可以簡潔地表達事物並利用模式。

在Scheme和Racket中,變量的值可以是數字或字符串 - 也可以是函數。函數是「一流」值,就像數字和字符串一樣。你問的第一種形式有關使說清楚:

(define x 1) 
(define y "foo") 
(define f (lambda (x) (+ x 2)) ;a function is a value like any other 

這是很好的學習和記憶,即使你通常使用的簡寫形式定義一個名爲功能。

+0

糟糕,您需要將函數作爲'map'調用的第一個參數。 –

+0

Gah。謝謝。 ;) –

+1

所以基本上你不必在使用lambda時定義一個函數?或不?看起來很簡單。 – Josh

1

可能(我想象)你正在爲一堂課做這個。可能他們希望你使用lambda,所以你更熟悉lambda的工作原理。這兩個功能都做同樣的事情。前者更簡單。但是,後者也很簡單,有時候簡單的例子就是示範。

另外,您稍後可能會使用map函數。這通常用lambda函數來表示,但即使在這種情況下,任何一個例子都可以工作。

2

那麼,如果你的例子是只有使用lambda,那麼顯然它是多餘的。但也有lambdadefine之外的許多其他應用,比如這個:

(map (lambda (x y) 
     (sqrt (+ (* x x) (* y y)))) 
    '(3 6 9) '(4 8 12)) 
2

下面是使用相同的過程短表和lambda一個例子:

(define (make-generator from step-proc) ; short form 
    (lambda() ; the lambda here is the procedure returned 
    (let ((tmp from)) 
     (set! from (step-proc from)) 
     tmp))) 

;; can't use short form here since make-generator 
;; returns the procedure 
(define natural 
    (make-generator 1 
        ;; use an anonymous procedure 
        ;; to increase the previous number by 1 
        (lambda (x) (+ 1 x)))) 

(natural) ; ==> 1 
(natural) ; ==> 2 
(natural) ; ==> 3 

;; can't use short form here since make-generator 
;; returns the procedure 
(define rational 
    (make-generator 1 
        ;; use an anonymous procedure 
        ;; to halve the previous number 
        (lambda (x) (/ x 2)))) 

(rational) ; ==> 1 
(rational) ; ==> 1/2 
(rational) ; ==> 1/4 

現在,計劃沒有原來有短形式(直到R3RS在1986年,第一規格11年後) ,但現在已經有好幾次修訂,只要理解它是一樣的,就可以使用它。一些書籍的第一版本早於R3RS,並且有些書籍沒有更新使用它,因爲它可能會讓人困惑,並且有多種方法來定義程序。其中一本書是優秀的Little Schemer