我得到這個什麼是lambda的要點?
(define (ident x) x)
相同
(define ident (lambda (x) x))
但是,爲什麼使用拉姆達時,你可以簡單地使用以前在這裏?這看起來不是更簡單嗎?
我得到這個什麼是lambda的要點?
(define (ident x) x)
相同
(define ident (lambda (x) x))
但是,爲什麼使用拉姆達時,你可以簡單地使用以前在這裏?這看起來不是更簡單嗎?
是的,通常你會定義一個函數,並給它起名字時使用簡寫。
有時候定義一個函數可以立即使用,並且不需要名稱。人們經常稱這些「匿名功能」。當你不需要需要它有一個名字,很高興不被強迫提供一個。
例如,假設您想要將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
這是很好的學習和記憶,即使你通常使用的簡寫形式定義一個名爲功能。
可能(我想象)你正在爲一堂課做這個。可能他們希望你使用lambda,所以你更熟悉lambda的工作原理。這兩個功能都做同樣的事情。前者更簡單。但是,後者也很簡單,有時候簡單的例子就是示範。
另外,您稍後可能會使用map
函數。這通常用lambda函數來表示,但即使在這種情況下,任何一個例子都可以工作。
那麼,如果你的例子是只有使用lambda
,那麼顯然它是多餘的。但也有lambda
的define
之外的許多其他應用,比如這個:
(map (lambda (x y)
(sqrt (+ (* x x) (* y y))))
'(3 6 9) '(4 8 12))
下面是使用相同的過程短表和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。
糟糕,您需要將函數作爲'map'調用的第一個參數。 –
Gah。謝謝。 ;) –
所以基本上你不必在使用lambda時定義一個函數?或不?看起來很簡單。 – Josh