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 add27
adını işlev söyledi. y
parametresi olarak alınan lambda
'u hatırlıyor musunuz? şimdi bu lambda
add27
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.
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
Üzgünüm, ancak bunun bir işlevi nasıl döndürdüğü hala net değil. Anlamadım. – 1Raptor007
@ 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 –