TL; DR Diğerlerinin de belirttiği gibi: lambda notasyonu sadece bir isim vermek zorunda kalmadan fonksiyonları tanımlamanın bir yoludur.
Uzun versiyon
Bu konuyu biraz ele almak istiyorum, çünkü çok ilginç buluyorum. Feragatname: Lamda calculus kursumu uzun zaman önce aldım. Daha iyi bilgiye sahip biri cevabımda herhangi bir yanlışlık bulursa, geliştirmeme yardımcı olmaktan çekinmeyin.
İfadelerle başlayalım, örneğin 1 + 2
ve x + 2
. Gibi Değişmez 1
ve 2
denir sabitleri bunlar belirli sabit değerlere bağlıdırlar çünkü.
Gibi bir tanımlayıcı değişken olarak x
adlandırılır ve değerlendirmek için önce onu bir değere bağlamanız gerekir. Yani, temelde ne olduğunu bilmediğiniz sürece değerlendiremezsiniz .x + 1
x
Lambda notasyonu, belirli girdi değerlerini değişkenlere bağlamak için bir şema sağlar. Bir lambda ifadesi , λx .
mevcut bir ifadenin önüne, örneğin λx . x + 1
; Değişken x
olduğu söylenir serbest olarak x + 1
ve bağlı olarakλx . x + 1
Bu ifadelerin değerlendirilmesinde nasıl yardımcı olur? Lambda ifadesine bir değer beslerseniz, bunun gibi
(λx . x + 1) 2
o zaman tüm ifadeyi değişkenin tüm oluşumlarını x
2 değeri ile değiştirerek (bağlayarak) değerlendirebilirsiniz :
(λx . x + 1) 2
2 + 1
3
Bu nedenle, lambda gösterimi, bir ifade / program bloğunda görünen değişkenlere şeyleri bağlamak için genel bir mekanizma sağlar. Bağlama bağlı olarak, bu programlama dillerinde çok farklı farklı kavramlar yaratır:
- Haskell gibi tamamen işlevsel bir dilde, lambda ifadeleri matematiksel anlamda işlevleri temsil eder : lambda gövdesine bir girdi değeri enjekte edilir ve bir çıktı değeri üretilir.
- Bir lambda ifadesinin gövdesini değerlendiren birçok dilde (örneğin, JavaScript, Python, Şema) yan etkileri olabilir. Bu durumda kişi, saf işlevler arasındaki farkı işaretlemek için yordam terimini kullanabilir .
Farklılıkların yanı sıra, lambda gösterimi resmi parametreleri tanımlamak ve bunları gerçek parametrelere bağlamakla ilgilidir.
Bir sonraki adım, bir fonksiyon / prosedüre bir isim vermektir. Çeşitli dillerde, fonksiyonlar diğerleri gibi değerlerdir, bu nedenle bir fonksiyona aşağıdaki gibi bir ad verebilirsiniz:
(define f (lambda (x) (+ x 1))) ;; Scheme
f = \x -> x + 1 -- Haskell
val f: (Int => Int) = x => x + 1 // Scala
var f = function(x) { return x + 1 } // JavaScript
f = lambda x: x + 1 # Python
Eli Barzilay'ın işaret ettiği gibi, bu tanım sadece ismi f
bir işlev olan bir değere bağlar . Dolayısıyla bu açıdan fonksiyonlar, sayılar, dizeler, karakterler aynı şekilde isimlere bağlanabilecek değerlerdir:
(define n 42) ;; Scheme
n = 42 -- Haskell
val n: Int = 42 // Scala
var n = 42 // JavaScript
n = 42 # Python
Bu dillerde, daha bilinen (ancak eşdeğer) gösterimini kullanarak bir isme bir işlev de bağlayabilirsiniz:
(define (f x) (+ x 1)) ;; Scheme
f x = x + 1 -- Haskell
def f(x: Int): Int = x + 1 // Scala
function f(x) { return x + 1 } // JavaScript
def f(x): return x + 1 # Python
Bazı diller, örneğin C, yalnızca belirtilen (adlandırılmış) fonksiyonları tanımlamak için kullanılan notasyonu destekler.
Kapaklar
Kapanışlarla ilgili bazı son gözlemler . İfadeyi düşünün x + y
. Bu iki serbest değişken içerir. x
Lamda notasyonu kullanarak bağlanırsanız , şunları elde edersiniz:
\x -> x + y
Bu (henüz) bir fonksiyon değildir çünkü hala bir serbest değişken içermektedir y
. Bunun dışında bir işlev y
de bağlayarak yapabilirsiniz :
\x -> \y -> x + y
veya
\x y -> x + y
bu sadece +
fonksiyonla aynıdır .
Ama y
başka bir şekilde (*):
incrementBy y = \x -> x + y
Bir sayıya fonksiyon artışı uygulamanın sonucu bir kapaktır, yani gövdesi y
, kapağın tanımlandığı ortamdan bir değere bağlı serbest bir değişken (örneğin ) içeren bir fonksiyon / prosedürdür .
Öyleyse incrementBy 5
, sayıları 5 oranında artıran işlev (kapatma).
NOT (*)
Burada biraz hile yapıyorum:
incrementBy y = \x -> x + y
eşittir
incrementBy = \y -> \x -> x + y
bu yüzden bağlama mekanizması aynıdır. Sezgisel olarak, daha karmaşık bir lambda ifadesinin bir yığınını temsil eden bir kapanma olduğunu düşünüyorum. Bu temsil oluşturulduğunda, ana ifadenin bazı bağları çoktan ayarlanmıştır ve kapatma, değerlendirildiği / çağrıldığı zaman bunları daha sonra kullanır.