Apa ini 'Lambda' yang terus dibicarakan semua orang? Banyak orang tampaknya menyukainya, tetapi yang dapat saya kumpulkan darinya hanyalah cara menjejalkan banyak baris kode ke dalam satu ekspresi.
Bisakah seseorang mencerahkan saya tentang nilai sebenarnya?
Jawaban:
Berfungsi tanpa nama
Sederhananya, lambda adalah fungsi tanpa nama, atau fungsi anonim. Sepotong kecil kode yang dapat dieksekusi, yang dapat diedarkan seolah-olah itu adalah variabel. Dalam JavaScript:
Mari kita lihat sekarang beberapa kegunaan lambda ini.
Mengabstraksi kode boilerplate
Lambdas dapat digunakan untuk mengabstraksi kode boilerplate. Misalnya loop. Kami terbiasa menulis
for
danwhile
mengulang sepanjang hari. Tetapi ini adalah kode yang tidak tertulis. Kita bisa mengekstrak kode di dalam loop, bagian terpenting dari loop, dan memisahkan sisanya:dengan menggunakan
forEach
objek array, menjadi:Abstraksi di atas mungkin tidak begitu berguna, tetapi ada fungsi tingkat tinggi lainnya, seperti
forEach
, yang menjalankan tugas yang jauh lebih berguna. Contohfilter
:Penundaan eksekusi kode
Di beberapa lingkungan, di mana konsep acara tersedia, kita dapat menggunakan lambda untuk menanggapi peristiwa yang mungkin terjadi di beberapa titik waktu.
Ini bisa saja dilakukan dengan beberapa cara lain, tetapi itu agak bertele-tele. Misalnya, di Java ada
Runnable
antarmuka.Pabrik fungsi
Sampai saat ini, kami hanya menggunakan lambda untuk sebagian besar kemampuan gula sintaksisnya. Tetapi ada situasi di mana lambda bisa jauh lebih berguna. Misalnya kita mungkin memiliki fungsi yang mengembalikan lambda. Katakanlah kita memiliki fungsi yang nilai kembaliannya ingin di-cache.
Nanti, kita mungkin memperhatikan bahwa kita memiliki fungsi yang serupa:
Jelas ada pola di sana, jadi mari kita abstraksi. Mari gunakan memoization .
Seperti yang Anda lihat, dengan menggunakan lambda, kami dapat memisahkan logika caching / memoization. Jika untuk contoh lain ada beberapa solusi, saya yakin masalah khusus ini hampir tidak dapat diselesaikan dengan menggunakan teknik lain. Kami berhasil mengekstrak beberapa kode boilerplate penting ke satu tempat. Belum lagi kami menyingkirkan
users
danphotos
variabel global.Melihat profil Anda, saya melihat bahwa Anda sebagian besar adalah pengguna Python. Untuk pola di atas, Python memiliki konsep dekorator. Ada banyak contoh di internet untuk dekorator memoisasi . Satu-satunya perbedaan adalah bahwa di Python Anda kemungkinan besar memiliki fungsi bersarang bernama di dalam fungsi dekorator itu. Alasannya karena Python hanya mendukung lambda ekspresi tunggal. Tapi konsepnya sama.
Sebagai contoh penggunaan lambda Python. Kode di atas tempat kami memfilter angka genap dapat direpresentasikan dengan Python seperti ini:
Bagaimanapun, lambda tidak begitu kuat tanpa penutupan. Penutupan inilah yang membuat konsep lambda begitu kuat. Dalam contoh memoization saya, saya telah menggunakan closures untuk membuat closure di sekitar
store
param. Dengan cara ini, saya memiliki akses ke param itu bahkan setelahmemoize
fungsi mengembalikan hasilnya (lambda).sumber
Istilah "lambda" digunakan untuk merujuk ke fungsi anonim, biasanya penutupan . Mereka berguna karena memungkinkan Anda untuk menulis fungsi yang menggunakan fungsi lain tanpa membengkak kode Anda yang tidak perlu. Misalnya, di Ruby:
Ini akan membuat array yang berisi bilangan genap antara 1 dan 100. Kita tidak perlu menulis loop eksplisit - metode select mengambil fungsi yang digunakannya untuk menguji nilai, jadi yang kita butuhkan hanyalah logika kustom kita. Hal ini memungkinkan kami untuk menyesuaikan metode dengan praktis tanpa usaha atau pengeluaran tambahan. Pada dasarnya, kita dapat menyusun fungsi dari fungsi yang lebih kecil.
Itu hanya contoh mudah tentang apa yang bisa mereka lakukan. Kemampuan untuk menyampaikan fungsi sebagai data sangat kuat dan pemrogram bahasa fungsional secara rutin melakukan beberapa hal yang sangat menakjubkan dengannya.
sumber
"Lambda" mungkin terlalu sedikit. Lihatlah kalkulus Lambda . Ini berguna dalam pemrograman fungsional.
Dan pemrograman fungsional adalah paradigma pemrograman lain (seperti prosedural, atau berorientasi objek).
sumber
Lambdas di. NET cukup sering disebut sebagai "gula sintaksis". Mereka tidak secara langsung mempengaruhi fungsionalitas namun mereka membuat bahasanya lebih mudah untuk digunakan orang.
Ketika Anda telah memahami kekuatan penggunaannya, saya yakin Anda akan menemukan bahwa Anda akan menulis lebih sedikit kode dibandingkan dengan cara gaya lama menggunakan metode delegasi / anonim.
sumber
Jurnal Dr Dobbs memiliki artikel bermanfaat yang memperkenalkan ekspresi lambda (dalam konteks C ++ tetapi saya pikir Anda dapat menerapkan prinsip-prinsip tersebut ke bahasa apa pun).
Seperti yang dikatakan artikel: "Ekspresi lambda adalah ekspresi yang sangat kompak yang tidak memerlukan definisi kelas / fungsi terpisah."
Jadi menggunakan contoh daftar 1 & 2 dari DDJ daripada menulis:
Yang membutuhkan definisi kelas terpisah seperti:
Menggunakan pustaka Boost lambda, ini bisa menjadi:
Yang membuat definisi tetap sejalan.
Artikel tersebut juga menjelaskan beberapa aplikasi lagi dari ekspresi lambda.
Saya pikir poin kunci dalam artikel DDJ adalah "Biasanya, ekspresi lambda digunakan ketika fungsi kecil dan tidak terlalu kompleks diperlukan di situs panggilan. Jika fungsinya tidak sepele, Anda tidak akan menginginkan ekspresi lambda tetapi fungsi normal atau objek fungsi. "
sumber
Jika Anda pernah bekerja dengan fungsi / metode yang menggunakan penunjuk fungsi, delegasi, strategi atau pola pengamat / penanganan peristiwa, dan berpikir "Saya menulis seluruh fungsi ini hanya untuk menggunakannya sekali saja - untuk meneruskannya ke metode ini ; Saya berharap saya bisa menulisnya di tempat, daripada mengacaukan kode saya "- di situlah Anda dapat menggunakan fungsi Lambda. Bahasa yang mendukung konstruksi ini juga biasanya sangat memanfaatkan konsep meneruskan fungsi sebagai parameter, terutama dalam hal bekerja dengan daftar (fungsi kelas satu dan fungsi urutan yang lebih tinggi). Hal ini terutama berlaku untuk bahasa fungsional, yang mengandalkan komposisi fungsi daripada modifikasi memori untuk komputasi. Dalam beberapa kasus (dalam bahasa seperti Python),
sumber
Kata 'lambda' qua adalah terminologi dari zaman ketika jenis ilmu komputer lebih mungkin untuk dilatih dalam matematika atau logika daripada memiliki gelar ilmu komputer. Beberapa dari mereka membuat paradigma yang disebut 'pemrograman fungsional', sangat berbeda dari imperatif dan juga cukup kuat. AFAIK itulah lingkungan tempat istilah itu mulai digunakan.
Ahli matematika dan ahli logika terbiasa menggunakan kata-kata aneh.
'lambda' terdengar sangat esoteris - seolah-olah itu adalah hal yang sangat aneh dan istimewa. Sungguh, jika Anda menulis JavaScript untuk aplikasi browser web dan menggunakan idiom "var foo = function () {...}", Anda telah menggunakan fungsi lambda selama ini.
sumber
Ekspresi lambda adalah bentuk fungsi yang sederhana. Idenya adalah sesuatu dari bentuk di sebelah kiri (setara dengan parameter) menjadi sesuatu dari bentuk di sebelah kanan (setara dengan tubuh).
misalnya, dalam c sharp:
adalah lambda untuk mengkuadratkan nilai. Sesuatu dari bentuknya
menjadi sesuatu dari bentuk
sumber
"Ekspresi lambda adalah fungsi anonim yang bisa berisi ekspresi dan pernyataan, dan bisa digunakan untuk membuat delegasi atau tipe pohon ekspresi.
Semua ekspresi lambda menggunakan operator lambda =>, yang dibaca sebagai "pergi ke". Sisi kiri operator lambda menentukan parameter input (jika ada) dan sisi kanan memegang blok ekspresi atau pernyataan. Ekspresi lambda x => x * x dibaca "x pergi ke x kali x."
dari MSDN
sumber
Untuk penjelasan lengkap tentang ekspresi Lambda, lihat juga Wikipedia . (Gulir ke bawah ke bagian kalkulus dan bahasa pemrograman Lambda.) Ekspresi lambda bukanlah hal baru dan mereka bukan hanya bagian dari C # tetapi sesuatu yang telah diperkenalkan ke komputasi hampir 80 tahun yang lalu! Ekspresi lambda adalah dasar untuk pemrograman fungsional.
Itu nilainya? Nah, mengingat itu sebenarnya cukup tua, saya akan mengatakan: sangat berharga bagi siapa pun yang melakukan perhitungan.
sumber
Jika Anda menggunakan Java, Anda telah mendengar banyak tentang lambda atau closure dalam beberapa bulan terakhir, karena ada usulan yang berbeda untuk menambahkan fitur ini ke Java 7. Namun, saya rasa comitee membatalkannya. Salah satu proposal berasal dari Neal Gafter dan dijelaskan dengan sangat rinci di sini: javac.info . Ini membantu saya memahami kasus penggunaan dan keuntungan (terutama di kelas dalam)
sumber
Anda akan menemukan semua yang perlu Anda ketahui (tentang C # Lambdas) untuk memulai di sini:
Ekspresi Lambda
sumber
Untuk java lambda, ini mungkin titik awal yang baik:
http://rodrigouchoa.wordpress.com/2014/09/10/java-8-lambda-expressions-tutorial/
sumber
Ya, ini hanyalah cara menjejalkan banyak baris kode menjadi satu ekspresi. Tetapi menjadi penjejalan yang efisien, ini memungkinkan beberapa cara baru untuk menyusun program Anda.
Seringkali seseorang akan menghindari penulisan delegasi atau callback dan kembali ke gaya prosedural hanya karena terlalu merepotkan untuk mendeklarasikan fungsi atau kelas baru untuk satu ekspresi.
Ekspresi lambda membuatnya bermanfaat untuk menggunakan callback bahkan untuk tugas-tugas terkecil, yang mungkin membuat kode lebih jelas. Mungkin tidak.
sumber