2014-09-06 23 views
7

Ben rakımda lambda kullanımını anlamaya çalışıyorum ve hala belirsizim. İsimsiz (anonim) işlevlerin olduğunu anlıyorum ama neden bu iyi? İşlevlerime diğer işlevlerden erişmem gerekiyor, bu yüzden onları nasıl arayabilirim? Lütfen aşağıdaki küçük programı açıklayınız ve lambda'nın kullanılması neden daha iyidir? Teşekkür ederim. öncelikle bu tanımlamadan parametre olarak bir in-line, tek seferlik fonksiyonunu geçirmek istediğinizdeRakamda Lambda Açıklandı

Racket (ve diğer fonksiyonel programlama dilleri) olarak
; why is this better than below??? 
(define test 
    (lambda (x) 
    (lambda (y) 
     (+ x y)))) 

(define add27 
    (test 27)) 

; what's wrong with this??? 
(define (addTest x) 
    (+ x 27)) 

> (add27 2) 
29 
> (addTest 2) 
29 

cevap

10

lambda s, çok faydalıdır. Örneğin, bir sayı listesinin karesini çizmek istediğimizi varsayalım. Biz uzun bir yol ve ilk bir square işlevi tanımlamak ve sonra map kullanabilirsiniz:

(define (square x) 
    (* x x)) 

(map square '(1 2 3 4 5)) 
=> '(1 4 9 16 25) 

... Ya biz sadece böyle bir lambda geçirebilirsiniz:

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

=> '(1 4 9 16 25) 

Gördüğünüz gibi, orada Bir fonksiyonun ismine başvurmak için 'un'a ihtiyaç duymadığı durumlar mevcuttur. Tabii ki, lambda ile temsil prosedür gidiyorsa çeşitli yerlerinde yeniden veya daha sonra özyinelemeli eğer o buna bir isim vermek mantıklı edilecek (yani artık anonim değil):

(define square 
    (lambda (x) (* x x))) 

yukarıda edilir Başlangıçta square'un ilk tanımına eşdeğerdir. Aslında, ilk tanım bir işlevi tanımlamak için sadece sözdizimsel şekerdir, ancak sonunda tüm işlevler lambdas'tır!

Şimdi örneğinizi görelim. Burada biraz daha farklı bir şekilde bir lambda kullanıyorsanız ve aynı zamanda kullanışlı konum neden örnek teşkil - biz sadece bir işlev tanımlama değil, ama aynı zamanda bir işlev dönen:

(define test 
    (lambda (x) 
    (lambda (y) 
     (+ x y)))) 

Belki bu bir olacak biz bunu böyle yazarsanız daha net bit (sebepler yukarıda belirtilen için, eşdeğer):

(define (test x) 
    (lambda (y) 
    (+ x y))) 

Ya da kısa - biz de aynı amaçla bu sözdizimini kullanabilirsiniz Racket içinde:

(define ((test x) y) 
    (+ x y)) 

Bu, bir işlevi tanımlamak için bu daha iyi (veya daha kötü) yolu değil, farklı bir şey! test, x parametresi olarak kabul edilen ve sonuç olarak yeni bir anonim işlev döndüren test isimli bir yordamı tanımlamaktayız, bu da y parametresi olarak alır. Şimdi, bu satırları:

(define add27 
    (test 27)) 

... anonim işlevini döndürür 27 bir x değeri ile test aradığınız ve biz add27adını işlev söyledi. y parametresi olarak alınan lambda'u hatırlıyor musunuz? şimdi bu lambdaadd27 olarak adlandırıldı - ve bu bir currying örneğidir.düşünün: Bu işler neden test verilen bir parametre y için sabit bir değer x eklemek fonksiyonları üretmek için kullanılan bir fonksiyondur açıklıyor:

Öte yandan
(add27 2) 
=> 29 

, bu işlev her zaman 27 katacak Değiştirmek için hiçbir yolu olmayan parametresine:

(define (addTest x) 
    (+ x 27)) 

(addTest 2) 
=> 29 

Farkı görüyor musunuz? test, rasgele bir değer ekleyen yeni işlevler oluşturmamıza izin verir, oysa addTest her zaman 27 sabit bir değer ekler. Ne demek istiyorsun, 100? test kullanarak bu basit:

(define add100 (test 100)) 

Ama addTest, yeni bir fonksiyon yazmak gerekir değiştirilemez: Açıklamalarda sormaya çekinmeyin,

(define (addTest100 x) 
    (+ x 100)) 

bu şeyleri düzeltmeye yardımcı olmuştur cevabımla ilgili başka sorular.

+1

Bu açıklama için çok teşekkür ederim. Hala nasıl çalıştığını anlamaya çalışıyorum ama bu harika bir başlangıç. Şimdi sadece 500 kez yeniden okumak gerekiyor. =) – 1Raptor007

+0

Üzgünüm, ancak bunun bir işlevi nasıl döndürdüğü hala net değil. Anlamadım. – 1Raptor007

+1

@ 1Raptor007 bir işlev son değeri döndürür. Örneğin, bu çağrıldığında '1 'döndürür:' (define (f) 1) '. Ve bir “lambda” nın da diğer herhangi bir değere sahip olduğu göz önüne alındığında, eğer şunu yazarsak: “(f (lambda (x) x)) 'yi tanımlayın, sonra çağrıldığında, sonuç olarak geri dönecek olan bir işleve sahibiz. anonim bir işlev –