fungsi lambda anonim (pemrograman fungsional)

10

Apa fungsi anonim (lambda)? Apa definisi formal dari fungsi anonim dalam bahasa pemrograman fungsional?

Dalam istilah sederhana saya, ketika saya pemrograman dalam skema / lisp saya akan mengatakan fungsi anonim (lambda) adalah fungsi yang tidak terikat pada pengenal.

Apakah hanya itu yang dapat Anda katakan secara formal tentang fungsi lambda? Saya pikir ada lebih banyak detail yang dapat ditambahkan ke definisi sederhana ini. Tolong jelaskan, dan terima kasih!

CodeKingPlusPlus
sumber
2
Pernahkah Anda melihat apa gunanya lambda dalam skema?
Guy Coder

Jawaban:

10

Menurut pendapat saya, hanya itu yang bisa Anda katakan tentang mereka.

Idenya adalah bahwa dalam bahasa tingkat tinggi, suatu fungsi hanyalah jenis nilai lain. Cara yang sama Anda dapat memiliki (3 + 4) tanpa pengenal dalam C, Anda dapat memiliki (lambda (x) + (3 x)))) tanpa skema pengidentifikasi.

Kuncinya di sini bukanlah bahwa ada sesuatu yang istimewa tentang fungsi anonim. Hanya pembatasan bahasa lain yang mengharuskan fungsi diperlakukan berbeda dari nilai lainnya. Definisi khusus untuk bahasa prosedural yang tidak memungkinkan, bukan untuk bahasa fungsional dengan do.

Ya ampun
sumber
11

Dalam kalkulus lambda, semua fungsi (istilah) adalah anonim. Ini adalah properti penting dari kalkulus lambda: Anda dapat membuat fungsi kompleks dari yang lebih sederhana tanpa memberi mereka nama.

Dalam bahasa pemrograman, dalam banyak kasus diinginkan untuk memberi nama pada fungsi, karena ini adalah cara kita berpikir dan membuat kode dapat dibaca oleh manusia. Tetapi kompilasi pada akhirnya menghapus nama-nama saat menghasilkan executable (jika kita mengabaikan informasi debug).

Jika suatu bahasa memungkinkan pengekspresian fungsi anonim (yaitu fungsi tanpa nama), itu dapat memberi keuntungan baik bagi programmer dan kompiler: Pemrogram sering dapat menulis kode yang lebih pendek, dan kompiler dapat lebih mengoptimalkan, mengetahui bahwa fungsi anonim digunakan hanya pada saat yang diberikan tempat dan tidak di tempat lain.

Petr Pudlák
sumber
1

Itu tergantung pada bagian mana dari pertanyaan Anda yang Anda tekankan. Jika itu khusus milik anonim untuk fungsi anonim, maka memang satu-satunya jawaban adalah bahwa mereka adalah nilai yang tidak terikat . Jika Anda berbicara tentang fungsi secara umum, fungsi anonim mungkin merupakan manifestasi yang paling terlihat dari penggunaan kalkulus lambda dalam pengaturan fungsional, untuk bahasa aplikatif .

Bahkan, dari sudut pandang kalkulus lambda, ekspresi lambda adalah konstruksi sangat sintaksis yang digunakan untuk membuat binding. Ingat notasi yang digunakan dalam lambda calculus:

λf.λx.fx

di mana dan terikat dalam ekspresi batin . Setiap ekspresi lambda di sana mendefinisikan pengikatan, dan dengan demikian bertindak sebagai konteks lokal untuk binding nama.x f xfxfx

Bahasa biasanya menawarkan cara, seperti let(bahasa seperti ML, skema), atau define(skema) untuk membuat binding yang dapat digunakan di tingkat atas (atau dalam konstruksi sintaksis yang lebih kompleks daripada fungsi, seperti modul atau objek), tetapi satu-satunya alat yang diperlukan untuk binding adalah lambda di level bawah.

Jika Anda melihat bahasa seperti dialek skema atau bahasa, dana mereka adalah lambda calculus, dan banyak bentuk khusus benar-benar lambda berlapis gula.

Untuk bahasa concatenative , ceritanya sedikit berbeda. Lambdas tidak diperlukan, dan sebenarnya kontra-produktif. Apa gunanya mendefinisikan lambdas anonim, ketika semuanya adalah fungsi ?

Entah bagaimana ada dualitas antara kedua jenis bahasa ini. Yang kemudian difokuskan pada kombinasi fungsi titik bebas dan dengan demikian mencoba untuk mewakili segala sesuatu sebagai fungsi, sedangkan yang sebelumnya bekerja pada kalkulus yang lebih rumit, dan membuat upaya untuk memiliki fungsi sebagai nilai-nilai kelas pertama, seperti nilai-nilai bahasa lainnya. Dalam hal ini, orang dapat melihat lambda sebagai hasil dari upaya itu.

Beberapa petunjuk tentang topik yang diperkenalkan (buruk) dalam jawaban ini:

  • artikel Jon Purdy tentang bahasa-bahasa bersambung
  • diskusi yang terjadi pada LtU
didierc
sumber