Sejauh ini saya mendengar tentang:
- Kalkulus Lambda
- Pemrograman Lambda
- Ekspresi Lambda
- Fungsi Lambda
Yang semuanya tampaknya terkait dengan pemrograman fungsional ...
Rupanya itu akan diintegrasikan ke dalam C ++ 1x, jadi saya mungkin lebih mengerti sekarang:
http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions
Adakah yang bisa mendefinisikan dengan singkat apa saja hal-hal lambdas dan memberikannya di tempat yang bermanfaat?
c++
functional-programming
lambda
jokoon
sumber
sumber
Jawaban:
Kalkulus lambda adalah model perhitungan yang ditemukan oleh Gereja Alonzo pada usia 30-an. Sintaks dan semantik dari sebagian besar bahasa pemrograman fungsional secara langsung atau tidak langsung terinspirasi oleh kalkulus lambda.
Kalkulus lambda dalam bentuk paling dasar memiliki dua operasi: Abstraksi (membuat fungsi (anonim)) dan aplikasi (menerapkan fungsi). Abstraksi dilakukan menggunakan operator λ, memberi nama lambda kalkulus.
Fungsi anonim sering disebut "lambdas", "fungsi lambda" atau "ekspresi lambda" karena, seperti yang saya katakan di atas, λ adalah simbol untuk membuat fungsi anonim dalam kalkulus lambda (dan kata
lambda
itu digunakan untuk membuat fungsi anonim di banyak bahasa) bahasa berbasis untuk alasan yang sama).Ini bukan istilah yang umum digunakan, tapi saya berasumsi itu berarti pemrograman menggunakan fungsi anonim atau pemrograman menggunakan fungsi tingkat tinggi.
Sedikit lebih banyak informasi tentang lambdas di C ++ 0x, motivasi mereka dan bagaimana mereka berhubungan dengan fungsi pointer (banyak dari ini mungkin merupakan pengulangan dari apa yang sudah Anda ketahui, tapi saya harap ini membantu menjelaskan motivasi lambdas dan bagaimana perbedaannya. dari pointer fungsi):
Pointer fungsi, yang sudah ada di C, cukup berguna untuk misal meneruskan fungsi perbandingan ke fungsi sortir. Namun ada batas kegunaannya:
Misalnya jika Anda ingin mengurutkan vektor vektor dengan
i
elemen th dari masing-masing vektor (di manai
parameter run-time), Anda tidak bisa menyelesaikan ini dengan pointer fungsi. Sebuah fungsi yang membandingkan dua vektor dengani
elemen th mereka , perlu mengambil tiga argumen (i
dan dua vektor), tetapi fungsi pengurutan akan membutuhkan fungsi yang mengambil dua argumen. Apa yang kita perlukan adalah cara untuk menyediakan argumeni
ke fungsi sebelum meneruskannya ke fungsi sortir, tetapi kita tidak bisa melakukan ini dengan fungsi C biasa.Untuk mengatasi ini, C ++ memperkenalkan konsep "objek fungsi" atau "functors". Functor pada dasarnya adalah objek yang memiliki
operator()
metode. Sekarang kita dapat mendefinisikan kelasCompareByIthElement
, yang mengambil argumeni
sebagai argumen konstruktor dan kemudian mengambil dua vektor untuk dibandingkan sebagai argumen untukoperator()
metode ini. Untuk mengurutkan vektor vektor dengani
elemen th kita sekarang dapat membuatCompareByIthElement
objek dengani
sebagai argumen dan kemudian meneruskan objek itu ke fungsi pengurutan.Karena objek fungsi hanya objek dan bukan fungsi teknis (meskipun mereka dimaksudkan untuk berperilaku seperti mereka), Anda tidak dapat membuat pointer fungsi menunjuk ke objek fungsi (Anda tentu saja dapat memiliki pointer ke objek fungsi, tetapi akan memiliki tipe like
CompareByIthElement*
dan karenanya tidak menjadi pointer fungsi).Sebagian besar fungsi di pustaka standar C ++ yang mengambil fungsi sebagai argumen didefinisikan menggunakan templat sehingga berfungsi dengan pointer fungsi serta objek fungsi.
Sekarang untuk lambdas:
Mendefinisikan seluruh kelas untuk dibandingkan dengan
i
elemen th adalah sedikit bertele-tele jika Anda hanya akan menggunakannya sekali untuk mengurutkan vektor. Bahkan dalam kasus di mana Anda hanya memerlukan pointer fungsi, mendefinisikan fungsi bernama tidak optimal jika hanya digunakan sekali karena a) itu mencemari namespace dan b) fungsi biasanya akan sangat kecil dan tidak ada yang benar-benar alasan yang bagus untuk abstrak logika ke dalam fungsinya sendiri (selain itu Anda tidak dapat memiliki pointer fungsi tanpa mendefinisikan suatu fungsi).Jadi untuk memperbaiki lambda ini diperkenalkan. Lambdas adalah objek fungsi, bukan pointer fungsi. Jika Anda menggunakan
[x1, x2](y1,y2){bla}
kode seperti lambda literal dihasilkan yang pada dasarnya melakukan hal berikut:x1
danx2
) danoperator()
dengan argumen (y1
dany2
) dan tubuhbla
.x1
danx2
nilai-nilai variabelx1
danx2
saat ini dalam ruang lingkup.Jadi lambda berperilaku seperti objek fungsi, kecuali bahwa Anda tidak dapat mengakses kelas yang dihasilkan untuk mengimplementasikan lambda dengan cara apa pun selain menggunakan lambda. Akibatnya setiap fungsi yang menerima functors sebagai argumen (pada dasarnya berarti fungsi non-C di pustaka standar), akan menerima lambdas, tetapi fungsi apa pun yang hanya menerima pointer fungsi tidak akan.
sumber
std::sort
misalnya), Anda akan dapat menggunakan fungsi anonim. Namun ketika mendefinisikan fungsi yang harus mengambil fungsi anonim sebagai argumennya, Anda harus menggunakan templat atau menggunakanstd::function
sebagai tipe argumen.+1
dari saya.Pada dasarnya, fungsi lambda adalah fungsi yang Anda buat "on the fly". Dalam C ++ 1x mereka dapat digunakan untuk meningkatkan dukungannya untuk pemrograman fungsional:
Ini kira-kira akan menghasilkan kode yang mirip dengan yang ini:
Jika Anda
some_functor
hanya perlu untuk satu panggilan inistd::for_each()
, maka fungsi lambda memiliki beberapa keunggulan daripada itu:sumber
Fungsi lambda adalah nama lain untuk fungsi anonim - pada dasarnya fungsi tanpa nama.
Biasanya Anda menggunakan ini dalam bahasa di mana Anda hanya perlu menggunakan fungsi satu kali. Misalnya bukan
dan kemudian meneruskan fungsi itu ke fungsi lain seperti itu
Dengan lambda, Anda cukup melakukannya
sumber