Untuk seseorang tanpa latar belakang komputer, apa itu lambda di dunia Ilmu Komputer?
lambda
language-agnostic
computer-science
terminology
theory
Brian Warshaw
sumber
sumber
Jawaban:
Lambda berasal dari Kalkulus Lambda dan mengacu pada fungsi anonim dalam pemrograman.
Kenapa ini keren? Hal ini memungkinkan Anda untuk menulis fungsi membuang cepat tanpa menamai mereka. Ini juga menyediakan cara yang bagus untuk menulis penutupan. Dengan kekuatan itu kamu bisa melakukan hal seperti ini.
Python
Seperti yang dapat Anda lihat dari potongan Python, fungsi adder mengambil argumen x, dan mengembalikan fungsi anonim, atau lambda, yang membutuhkan argumen lain y. Fungsi anonim itu memungkinkan Anda membuat fungsi dari fungsi. Ini adalah contoh sederhana, tetapi harus menyampaikan kekuatan lambdas dan penutupan miliki.
Contoh dalam bahasa lain
Perl 5
JavaScript
JavaScript (ES6)
Skema
C # 3.5 atau lebih tinggi
Cepat
PHP
Haskell
Java melihat posting ini
Lua
Kotlin
Rubi
Ruby sedikit berbeda karena Anda tidak dapat memanggil lambda menggunakan sintaks yang sama persis dengan memanggil fungsi, tetapi masih memiliki lambda.
Ruby menjadi Ruby, ada singkatan untuk lambdas, sehingga Anda dapat mendefinisikan
adder
dengan cara ini:R
sumber
Lambda adalah jenis fungsi, didefinisikan inline. Bersama dengan lambda Anda juga biasanya memiliki beberapa jenis tipe variabel yang dapat menyimpan referensi ke suatu fungsi, lambda atau lainnya.
Misalnya, berikut adalah sepotong kode C # yang tidak menggunakan lambda:
Ini panggilan Kalkulator, melewati tidak hanya dua angka, tetapi metode mana untuk memanggil dalam Kalkulator untuk mendapatkan hasil perhitungan.
Di C # 2.0 kami mendapat metode anonim, yang mempersingkat kode di atas menjadi:
Dan kemudian di C # 3.0 kami mendapat lambdas yang membuat kode lebih pendek:
sumber
Op
, seseorang dapat menggunakanFunc<int, int>
Console.WriteLine("Calculator: op " + op.Method.Name + " (" + a + ", " + b + ") = " + op(a, b));
untuk contoh pertama.Nama "lambda" hanyalah artefak sejarah. Yang kita bicarakan hanyalah ekspresi yang nilainya fungsi.
Contoh sederhana (menggunakan Scala untuk baris berikutnya) adalah:
di mana argumen ke
foreach
metode adalah ekspresi untuk fungsi anonim. Baris di atas kurang lebih sama dengan menulis sesuatu seperti ini (bukan kode yang sebenarnya, tetapi Anda akan mendapatkan ide):kecuali bahwa Anda tidak perlu repot dengan:
Setelah Anda terbiasa menjalankan nilai-nilai, harus melakukannya tanpa nilai-nilai itu tampak sama konyolnya dengan yang diminta untuk menyebutkan setiap ekspresi, seperti:
alih-alih hanya menulis ekspresi di mana Anda membutuhkannya:
Notasi persis bervariasi dari bahasa ke bahasa; Bahasa Yunani tidak selalu dibutuhkan! ;-)
sumber
Ini mengacu pada kalkulus lambda , yang merupakan sistem formal yang hanya memiliki ekspresi lambda, yang mewakili fungsi yang mengambil fungsi untuk satu-satunya argumen dan mengembalikan fungsi. Semua fungsi dalam kalkulus lambda adalah dari jenis itu, yaitu
λ : λ → λ
,.Lisp menggunakan konsep lambda untuk memberi nama literal fungsi anonimnya. Lambda ini mewakili fungsi yang mengambil dua argumen, x dan y, dan mengembalikan produk mereka:
Itu dapat diterapkan in-line seperti ini (mengevaluasi hingga 50 ):
sumber
λ : λ -> λ
membingungkan (dan sebenarnya tidak valid).Kalkulus lambda adalah teori substitusi matematika yang konsisten. Dalam matematika sekolah kita melihat misalnya
x+y=5
berpasangan denganx−y=1
. Bersamaan dengan cara untuk memanipulasi persamaan individual, juga memungkinkan untuk menyatukan informasi dari kedua persamaan ini, asalkan penggantian persamaan silang dilakukan secara logis. Kalkulus Lambda mengkodifikasi cara yang benar untuk melakukan penggantian ini.Mengingat bahwa
y = x−1
ini adalah penataan ulang yang valid dari persamaan kedua, ini:λ y = x−1
berarti fungsi pengganti simbolx−1
untuk simboly
. Sekarang bayangkan menerapkanλ y
setiap istilah dalam persamaan pertama. Jika suatu termy
kemudian melakukan substitusi; jika tidak lakukan apa-apa. Jika Anda melakukannya di atas kertas, Anda akan melihat bagaimana penerapannyaλ y
akan membuat persamaan pertama dapat dipecahkan.Itu jawaban tanpa ilmu komputer atau pemrograman.
Contoh pemrograman paling sederhana yang dapat saya pikirkan berasal dari http://en.wikipedia.org/wiki/Joy_(programming_language)#How_it_works :
Ditambahkan: http://imgur.com/a/XBHub
sumber
Sedikit disederhanakan: fungsi lambda adalah fungsi yang dapat diteruskan ke fungsi lain dan logikanya diakses.
Dalam C # lambda sintaks sering dikompilasi ke metode sederhana dengan cara yang sama seperti delegasi anonim, tetapi juga dapat dipecah dan logikanya dibaca.
Misalnya (dalam C # 3):
LinqToSql dapat membaca fungsi itu (x> 15) dan mengubahnya menjadi SQL aktual untuk dieksekusi menggunakan pohon ekspresi.
Pernyataan di atas menjadi:
Ini berbeda dari metode normal atau delegasi anonim (yang sebenarnya hanyalah kompiler ajaib) karena mereka tidak dapat dibaca .
Tidak semua metode dalam C # yang menggunakan sintaks lambda dapat dikompilasi ke pohon ekspresi (yaitu fungsi lambda yang sebenarnya). Contohnya:
Sekarang pohon ekspresi tidak dapat dibaca - SomeComplexCheck tidak dapat dipecah. Pernyataan SQL akan dijalankan tanpa di mana, dan setiap baris dalam data akan dimasukkan
SomeComplexCheck
.Fungsi Lambda tidak harus bingung dengan metode anonim. Contohnya:
Ini juga memiliki fungsi 'inline', tapi kali ini hanya kompiler ajaib - kompiler C # akan membagi ini menjadi metode instance baru dengan nama yang di-autogenerasi.
Metode anonim tidak dapat dibaca, sehingga logikanya tidak dapat diterjemahkan seperti untuk fungsi lambda.
sumber
Saya suka penjelasan Lambdas dalam artikel ini: Evolusi LINQ Dan Dampaknya Terhadap Desain C # . Bagi saya itu masuk akal karena menunjukkan dunia nyata untuk Lambdas dan membangunnya sebagai contoh praktis.
Penjelasan cepat mereka: Lambdas adalah cara untuk memperlakukan kode (fungsi) sebagai data.
sumber
Contoh lambda di Ruby adalah sebagai berikut:
Akan menghasilkan output berikut:
sumber
@Brian Saya menggunakan lambdas sepanjang waktu di C #, di operator LINQ dan non-LINQ. Contoh:
Sebelum C #, saya menggunakan fungsi anonim di JavaScript untuk panggilan balik ke fungsi AJAX, sebelum istilah Ajax bahkan diciptakan:
Hal yang menarik dengan sintaks lambda C #, adalah bahwa pada tipe mereka sendiri tidak dapat disimpulkan (yaitu, Anda tidak dapat mengetik var foo = (x, y) => x * y) tetapi tergantung pada jenis mereka ditugaskan untuk, mereka akan dikompilasi sebagai delegasi atau pohon sintaksis abstrak yang mewakili ekspresi (yang adalah bagaimana pemetaan objek LINQ melakukan sihir "bahasa-terintegrasi").
Lambdas di LISP juga dapat diteruskan ke operator kutipan dan kemudian dilalui sebagai daftar daftar. Beberapa makro yang kuat dibuat dengan cara ini.
sumber
Pertanyaan ini dijawab secara formal, jadi saya tidak akan mencoba menambahkan lebih banyak tentang ini.
Dalam kata - kata informal yang sangat sederhana kepada seseorang yang hanya tahu sedikit atau tidak sama sekali tentang matematika atau pemrograman, saya akan menjelaskannya sebagai "mesin" atau "kotak" kecil yang membutuhkan input, membuat beberapa pekerjaan dan menghasilkan beberapa output, tidak memiliki nama tertentu , tapi kami tahu di mana itu dan hanya dengan pengetahuan ini, kami menggunakannya.
Secara praktis, untuk orang yang tahu apa fungsi itu, saya akan memberi tahu mereka bahwa itu adalah fungsi yang tidak memiliki nama, biasanya dimasukkan ke titik dalam memori yang dapat digunakan hanya dengan merujuk ke memori itu (biasanya melalui penggunaan sebuah variabel - jika mereka telah mendengar tentang konsep fungsi pointer, saya akan menggunakannya sebagai konsep yang serupa) - jawaban ini mencakup dasar-dasar yang cantik (tidak menyebutkan penutupan dll) tetapi orang bisa mendapatkan poin dengan mudah.
sumber
Anda dapat menganggapnya sebagai fungsi anonim - inilah beberapa info lebih lanjut: Wikipedia - Fungsi Anonim
sumber
Hanya karena saya tidak dapat melihat contoh C ++ 11 di sini, saya akan melanjutkan dan memposting contoh yang bagus dari sini . Setelah mencari, itu adalah contoh spesifik bahasa paling jelas yang bisa saya temukan.
Halo, Lambdas, versi 1
Halo, Lambdas, versi 2:
sumber
Saya mengalami kesulitan membungkus kepala saya di sekitar ekspresi lambda karena saya bekerja di Visual FoxPro, yang memiliki subtitusi Makro dan fungsi ExecScript {} dan Evaluate (), yang tampaknya melayani banyak tujuan yang sama.
Satu manfaat pasti untuk menggunakan lambda formal adalah (saya berasumsi) memeriksa waktu kompilasi: Fox tidak akan tahu apakah Anda mengetikkan string teks di atas sampai ia mencoba menjalankannya.
Ini juga berguna untuk kode yang digerakkan oleh data: Anda dapat menyimpan seluruh rutinitas dalam bidang memo dalam database dan kemudian hanya mengevaluasinya pada saat dijalankan. Ini memungkinkan Anda mengubah sebagian aplikasi tanpa benar-benar memiliki akses ke sumbernya. (Tapi itu topik lain sama sekali.)
sumber
Saya akan mengilustrasikannya secara intuitif langkah demi langkah dalam kode python yang sederhana dan mudah dibaca.
Singkatnya, lambda hanyalah fungsi anonim dan sebaris.
Mari kita mulai dari tugas untuk dipahami
lambdas
sebagai mahasiswa baru dengan latar belakang aritmatika dasar.Cetak biru penugasan adalah 'the name = value', lihat:
'x', 'y' adalah nama dan 1, 'nilai' adalah nilai. Coba fungsi dalam matematika
Laporan kesalahan,
Anda tidak dapat menulis matematika secara langsung sebagai kode, 'n' harus didefinisikan atau ditugaskan ke suatu nilai.
Ini berfungsi sekarang, bagaimana jika Anda bersikeras menggabungkan dua baris yang terpisah menjadi satu. Datang
lambda
Tidak ada kesalahan yang dilaporkan.
Ini sekilas
lambda
, memungkinkan Anda untuk menulis fungsi dalam satu baris seperti yang Anda lakukan dalam matematika ke komputer secara langsung.Kami akan melihatnya nanti.
Mari kita lanjutkan menggali lebih dalam pada 'tugas'.
Seperti yang diilustrasikan di atas, simbol sama
=
berfungsi untuk tipe data sederhana (1 dan 'nilai') dan ekspresi sederhana (n ** 2 + 2 * n + 1).Coba ini:
Ini berfungsi untuk pernyataan sederhana, ada 11 jenis di python 7. Pernyataan sederhana - dokumentasi Python 3.6.3
Bagaimana dengan pernyataan majemuk,
Hadir
def
memungkinkannya bekerjaTada, analisis, 'm' adalah nama, 'n ** 2 + 2 * n + 1' adalah nilai.
:
adalah varian dari '='.Temukan, jika hanya untuk pemahaman, semuanya dimulai dari penugasan dan semuanya penugasan.
Sekarang kembali ke
lambda
, kita memiliki fungsi bernama 'm'Mencoba:
Ada dua nama 'm' di sini, fungsinya
m
sudah memiliki nama, digandakan.Ini memformat seperti:
Ini bukan strategi yang cerdas, jadi laporkan kesalahan
Kami harus menghapus salah satunya, mengatur fungsi tanpa nama.
Ini disebut 'fungsi anonim'
Kesimpulannya,
lambda
dalam fungsi sebaris yang memungkinkan Anda untuk menulis fungsi dalam satu garis lurus seperti halnya dalam matematikalambda
adalah anonimSemoga ini membantu.
sumber
Ini adalah fungsi yang tidak memiliki nama. Untuk misalnya dalam c # Anda dapat menggunakan
untuk mengembalikan angka yang lebih besar dari 5.
adalah bagian lambda di sini. Ini mewakili fungsi yang mengambil parameter (angka) dan mengembalikan nilai boolean (angka> 5). Metode GetMatchingItems menggunakan lambda ini pada semua item dalam koleksi dan mengembalikan item yang cocok.
sumber
Dalam Javascript, misalnya, fungsi diperlakukan sebagai jenis campuran yang sama seperti segala sesuatu yang lain (
int
,string
,float
,bool
). Dengan demikian, Anda dapat membuat fungsi dengan cepat, menetapkannya untuk beberapa hal, dan memanggilnya kembali nanti. Ini berguna tetapi, bukan sesuatu yang ingin Anda gunakan berlebihan atau Anda akan membingungkan semua orang yang harus menjaga kode Anda setelah Anda ...Ini adalah beberapa kode yang saya mainkan untuk melihat seberapa dalam lubang kelinci ini:
sumber
Dalam konteks CS fungsi lambda adalah konsep matematika abstrak yang menangani masalah evaluasi simbolik ekspresi matematika. Dalam konteks itu fungsi lambda sama dengan istilah lambda .
Tetapi dalam bahasa pemrograman itu sesuatu yang berbeda. Itu adalah bagian dari kode yang dinyatakan "di tempat", dan yang dapat diedarkan sebagai "warga negara kelas satu". Konsep ini tampaknya berguna sehingga masuk ke hampir semua bahasa pemrograman modern yang populer (lihat fungsi lambda di mana saja posting).
sumber
Mari kita lihat bagaimana Lambda (Penutupan) bekerja di Swift 4.2 dengan metode sortir () - dari fungsi normal hingga ekspresi terpendek:
1. Fungsi Normal
2. Ekspresi Penutupan
3. Ekspresi Penutupan Inline
4. Jenis Inferring Dari Konteks
5. Pengembalian Tersirat dari Penutupan Ekspresi Tunggal
6. Nama Argumen Singkatan
7. Metode Operator
Semoga ini membantu.
sumber
Saya mengerti juga. Saya sudah mencobanya di JS dengan yang ini:
Ia menambah 2 hingga 4 lalu memvariasikan hasilnya dengan 6. Namun saya terkadang kesulitan membaca :(
Saya juga sudah membuat fungsi forEach yang menarik:
forEach ([1,2,3,4,5]) (console.log);
Metode ini akan mengulangi larik dan melakukan tindakan - dalam hal ini pencetakan ke konsol. Sekarang saya juga mengerti mengapa labmdas sangat kuat.
sumber
Dalam pemrograman komputer, lambda adalah bagian dari kode (pernyataan, ekspresi atau sekelompok dari mereka) yang mengambil beberapa argumen dari sumber eksternal. Itu tidak harus selalu menjadi fungsi anonim - kami memiliki banyak cara untuk mengimplementasikannya.
Kami memiliki pemisahan yang jelas antara ekspresi, pernyataan, dan fungsi, yang tidak dimiliki oleh ahli matematika.
Kata "fungsi" dalam pemrograman juga berbeda - kami memiliki "fungsi adalah serangkaian langkah yang harus dilakukan" (dari bahasa Latin "perform"). Dalam matematika itu adalah sesuatu tentang korelasi antar variabel.
Bahasa fungsional berusaha menjadi serupa dengan rumus matematika mungkin, dan kata-katanya hampir sama. Tetapi dalam bahasa pemrograman lain kami memilikinya berbeda.
sumber
Pertanyaannya telah dijawab sepenuhnya, saya tidak ingin masuk ke detail. Saya ingin berbagi penggunaan saat menulis perhitungan numerik dengan karat.
Ada contoh lambda (fungsi anonim)
Ketika saya sedang menulis modul metode Newton-Raphson, itu digunakan sebagai turunan urutan pertama dan kedua. (Jika Anda ingin tahu apa itu metode Newton – Raphson, silakan kunjungi " https://en.wikipedia.org/wiki/Newton%27s_method ".
Output sebagai berikut
sumber
Bayangkan bahwa Anda memiliki restoran dengan opsi pengiriman dan Anda memiliki pesanan yang perlu dilakukan dalam waktu kurang dari 30 menit. Intinya adalah klien biasanya tidak peduli jika Anda mengirim makanan mereka dengan sepeda dengan mobil atau bertelanjang kaki selama Anda menjaga makanan tetap hangat dan diikat. Jadi mari kita ubah idiom ini ke Javascript dengan fungsi transportasi anonim dan terdefinisi.
Di bawah ini kami menentukan cara pengiriman kami alias kami mendefinisikan nama ke fungsi:
Bagaimana jika kita akan menggunakan fungsi panah / lambda untuk melakukan transfer ini:
Anda lihat tidak ada perbedaan untuk klien dan tidak ada waktu untuk memikirkan cara mengirim makanan. Kirimkan saja.
Btw, saya tidak merekomendasikan kebap dengan coke, inilah mengapa kode atas akan memberi Anda kesalahan. Selamat bersenang-senang.
sumber