Bagaimana cara mengucapkan "=>" seperti yang digunakan dalam ekspresi lambda di .Net

160

Saya sangat jarang bertemu programmer lain!

Pikiran saya ketika saya pertama kali melihat token itu "menyiratkan bahwa" karena itulah yang akan membacanya sebagai bukti matematika tetapi itu jelas tidak masuk akal.

Jadi bagaimana saya mengatakan atau membaca "=>" seperti pada: -

IEnumerable<Person> Adults = people.Where(p => p.Age > 16)

Atau bahkan ada cara yang disepakati untuk mengatakannya?

Christopher Edwards
sumber
6
120 suara cukup luar biasa untuk pertanyaan tertutup.
datps
Saya selalu cenderung mengucapkan "menyiratkan" sebagai operator yang tampak sama dalam logika.
IllidanS4 ingin Monica kembali

Jawaban:

149

Saya biasanya mengatakan 'seperti itu' ketika membaca operator itu.

Dalam contoh Anda, p => p.Age> 16 berbunyi "P, sehingga p.Age lebih besar dari 16."

Bahkan, saya mengajukan pertanyaan ini di forum pra-rilis resmi linq, dan Anders Hejlsberg menjawab dengan mengatakan

Saya biasanya membaca operator => sebagai "menjadi" atau "untuk yang". Misalnya,
Fungsi f = x => x * 2;
Uji fungsi = c => c.City == "London";
dibaca sebagai "x menjadi x * 2" dan "c yang c.City sama dengan London"

Sejauh 'pergi ke' - itu tidak pernah masuk akal bagi saya. 'p' tidak ke mana-mana.

Dalam hal membaca kode kepada seseorang, katakanlah, melalui telepon, lalu selama mereka adalah sesama programmer C #, saya hanya akan menggunakan kata 'lambda' - yaitu, "p lambda p dot usia lebih besar dari enambelas."

Dalam komentar Steve Jessop menyebutkan 'peta untuk' dalam kasus transformasi - jadi ambil contoh Anders:

x => x * 2;

akan membaca

x peta ke x kali 2.

Tampaknya memang lebih dekat dengan maksud sebenarnya dari kode daripada 'menjadi' untuk kasus ini.

Erik Forbes
sumber
1
Itu hanya akurat ketika lambda digunakan sebagai filter.
Andru Luvisi
4
"Goes to" adalah terjemahan yang kurang canggung dari "mengisi bingkai tumpukan"
Peter Wone
1
Saya benar-benar tidak suka "x menjadi x * 2"; x adalah input dan tetap sama sepanjang. Membaca seperti itu terdengar seperti operasi tugas.
Germán
@ Peter - hah, sangat benar. =) @ Germán - Saya cenderung setuju, meskipun saya tidak bisa memikirkan contoh yang lebih baik untuk transformasi. Mungkin 'berubah menjadi'?
Erik Forbes
5
Saya akan mengatakan "peta untuk" dalam hal ini. Ada sedikit risiko ketika orang-orang berpikir Anda berbicara tentang sebuah wadah, tetapi Anda dapat menjernihkannya dengan menjelaskan saat pertama kali Anda mengatakannya, bahwa yang Anda maksud adalah "operator lambda, Anda tahu, sama dengan-tanda-lebih besar- dari".
Steve Jessop
56

Dari MSDN :

Semua ekspresi lambda menggunakan operator lambda =>, yang dibaca sebagai "pergi ke".

Kent Boogaart
sumber
7
Intersting. Mungkin yang lebih menarik adalah bahwa itu benar untuk versi VS2010 , tetapi panduannya telah dihapus dari versi VS2012 .
Blair Conrad
@ BlairConrad - mungkin benar ketika Anda menulis komentar Anda, tetapi ada di sana untuk semua versi VS saat ini.
cp.engr
Saya tidak lagi melihat kata-kata "masuk ke" dalam dokumentasi MSDN yang ditautkan dalam jawaban di atas. Saya ingat sekitar tahun 2010 seorang mentor memberi tahu saya bahwa fungsi lambda harus dibaca sebagai "masuk ke" dan itulah sebabnya saya selalu membacanya. Namun, ketika saya tersandung ke pertanyaan ini, membacanya sebagai "sedemikian rupa" lebih masuk akal bagi saya.
matt.fc
18

Membaca Kode Melalui Telepon

Dari Eric Lippert:

Saya pribadi akan mengatakan c => c +1 sebagai "see goes to see plus one". Beberapa variasi yang pernah saya dengar:

Untuk proyeksi, (Pelanggan c) => c.Name: "lihat pelanggan menjadi melihat nama titik"

Untuk predikat, (Pelanggan c) => c.Age> 21: "pelanggan melihat sedemikian rupa sehingga usia dot lebih dari dua puluh satu"

Gulzar Nazim
sumber
"Goes to" adalah ungkapan yang paling banyak saya dengar saat bekerja di tim LINQ.
DamienG
15

Saya selalu menyebutnya "operator wang" :-)

"p wang umur p lebih besar dari 16"

Aidos
sumber
10
Itu Numberwang!
comichael
4
Anda harus memberi tahu saya di mana lagi di planet ini siapa pun menyebut ini "wang." Saya mempunyai anggota tim yang mengatakan kepada saya bahwa itu adalah "wang" dan satu-satunya tempat di internet yang kita dapat menemukannya adalah pada jawaban ini.
Kristopher
1
@Wartickler Saya dari Australia Barat - selalu menyebutnya operator wang :-)
Aidos
7

Saya pernah melihat orang berkata, "Panah."

Brian
sumber
6
Saya harap itu hanya lelucon.
Jacob Carpenter
Bukan - saya pernah melihat yang sama.
Erik Forbes
1
Saya pikir orang-orang yang mengatakan "panah" berarti ini: ->
Dour High Arch
6
Saya belum pernah melihat itu. Mendengarnya, mungkin, tetapi tidak terlihat.
ctacke
Panah tampaknya masuk akal bagi saya karena dimaksudkan untuk mewakili tanda panah dari lambda calculus. Saya pernah mendengar tipe akademik menyebutnya panah atau panah kanan, saya telah melihat kode Haskell pada slide lateks dengan -> operator diubah menjadi simbol panah.
Robert
7

Saya menggunakan "pergi ke" karena buku LINQ mengatakan kepada saya untuk :)

CodeChef
sumber
5

Bagaimana dengan "map to"? Keduanya ringkas dan bisa dibilang lebih akurat secara teknis (yaitu tidak ada saran perubahan negara seperti dengan "pergi ke" atau "menjadi", tidak ada penggabungan satu set dengan fungsi karakteristiknya seperti "seperti itu" atau "yang") daripada alternatif lain. Meskipun jika sudah ada standar seperti yang ditunjukkan oleh halaman MSDN, mungkin Anda harus melakukannya (setidaknya untuk kode C #).

Max Strini
sumber
3

"Peta ke" adalah pelafalan pilihan saya. Secara matematis, fungsi "memetakan" argumennya ke nilai pengembaliannya (orang mungkin bahkan menyebut fungsi itu "pemetaan"), jadi masuk akal bagi saya untuk menggunakan terminologi ini dalam pemrograman, khususnya sebagai pemrograman fungsional (terutama kalkulus lambda) sangat dekat dengan matematika. Ini juga lebih netral daripada "menjadi", "pergi ke", dll., Karena tidak menyarankan perubahan status, seperti yang disebutkan bebas konteks.

Will Vousden
sumber
2

Saya belum terlalu memikirkannya, tapi saya hanya mengatakan "untuk" dengan mudah. Ini singkat dan ringkas, dan menyiratkan bahwa variabel diteruskan ke ekspresi. Saya kira itu bisa dikacaukan dengan angka 2 ("dua"), tetapi saya cenderung mengucapkan "menjadi" lebih seperti "ta" ketika berbicara. Tak seorang pun (yang tahu lambdas, setidaknya) pernah mengatakan kepada saya bahwa mereka menganggapnya ambigu ...

// "Func f equals x to x times two"
Func f = x=> x * 2;

// "Func test equals c to c dot City equals London"
Func test = c => c.City == "London"
Mark Brackett
sumber
2

Jawaban singkat saya: "c 'lambda-of' e". Meskipun saya berpegang teguh pada "fungsi lambda 'fungsi' e", saya pikir lambda adalah kompromi ekumenis. Analisis berikut.

Ini adalah pertanyaan yang bagus jika hanya untuk jawaban yang aneh. Sebagian besar terjemahan memiliki arti lain selain untuk ekspresi lambda, yang mengarah ke interpretasi eksotis. Sebagai peretas berekspresi lambda lama, saya mengabaikan notasi .NET dan menulis ulang sebagai lambda di kepala saya sambil berharap mereka telah melakukan hampir hal lain untuk ini.


Untuk menceritakan kode melalui telepon, Anda ingin seseorang dapat menuliskan kode secara berurutan. Itu masalah, tentu saja, tetapi lambda-panah atau sesuatu mungkin adalah yang terbaik yang bisa Anda dapatkan, atau mungkin lambda-in, tetapi lambda-of adalah yang paling akurat.

Masalahnya adalah penggunaan infiks dan bagaimana menamai semuanya dan peran bagian kiri dan kanan dengan sesuatu yang berfungsi ketika diucapkan di tempat infiks.

Ini mungkin masalah yang terlalu terbatas!


Saya tidak akan menggunakan "seperti itu" karena itu menyiratkan bahwa sisi kanan adalah predikat yang harus dipenuhi oleh sisi kiri. Itu sangat berbeda dari berbicara tentang sisi kanan dari mana sisi kiri telah diabstraksikan sebagai parameter fungsional. (Pernyataan MSDN tentang "Semua ekspresi lambda" hanya ofensif dan juga tidak akurat.)

Sesuatu yang menggelitik tentang "pergi ke" meskipun mungkin sedekat yang bisa kita dapatkan. "Pergi ke" menyiratkan transformasi, tetapi tidak ada persis beberapa variabel c yang pergi ke ekspresi dalam c. Abstraksi ke suatu fungsi agak sulit dipahami. Saya bisa terbiasa dengan hal ini, tetapi saya masih merindukan sesuatu yang menekankan abstraksi variabel.

Karena sisi kiri selalu merupakan pengidentifikasi sederhana dalam kasus-kasus yang digunakan sejauh ini [tetapi tunggu ekstensi yang dapat membingungkan ini nanti], saya pikir untuk "c => ekspresi" Saya akan membaca ekspresi "c 'lambda-function' "'atau bahkan" c' arg '' berfungsi 'ekspresi ". Dalam kasus terakhir, saya kemudian bisa mengatakan hal-hal seperti "b 'arg' c 'arg' 'function' expression".

Mungkin lebih baik untuk membuatnya lebih jelas bahwa ekspresi lambda sedang diperkenalkan dan mengatakan sesuatu seperti "'arg' b 'arg' c 'function' ekspresi".

Mencari tahu bagaimana menerjemahkan semua ini ke bahasa lain adalah latihan untuk siswa [; <).

Saya masih khawatir tentang "(b, c) => ekspresi" dan varian lain yang mungkin muncul jika belum. Mungkin ungkapan "'args' b, c 'function'".


Setelah semua renungan ini, saya perhatikan bahwa saya datang untuk menerjemahkan "c => e" sebagai "'lambda' c 'fungsi' e" dan memperhatikan bahwa pemetaan ke bentuk yang tepat harus dipahami oleh konteks: λc (e ), c => e, f di mana f (c) = e, dll.

Saya berharap bahwa penjelasan "masuk" akan berlaku hanya karena ini adalah di mana mayoritas dominan akan melihat ekspresi lambda untuk pertama kalinya. Sangat disayangkan. Kompromi yang baik mungkin "c ' lambda-of ' e"

orcmid
sumber
1
'' Saya tidak akan menggunakan "seperti itu" karena itu menyiratkan bahwa sisi kanan adalah predikat '' - ketika itu digunakan sebagai predikat, maka ini adalah terjemahan yang valid, kecuali saya salah paham dengan Anda.
Erik Forbes
2

Jika Anda membayangkan ekspresi lambda sebagai metode anonim, "lanjutkan ke" cukup masuk akal.

(n => n == String.Empty)

n "pergi ke" ekspresi n == String.Empty.

Itu pergi ke metode anonim, jadi Anda tidak harus pergi ke metode dalam kode!

Maaf untuk itu.

Jujur, saya tidak suka menggunakan "pergi ke" di kepala saya, tetapi saya melihat orang lain mengatakan itu tampak aneh, dan saya pikir saya akan menjernihkannya.

Jonesopolis
sumber
2

Selain memperoleh ruang lingkup sebelumnya (semua variabel dan konstanta yang berada dalam ruang lingkup untuk baris kode normal pada titik di mana ekspresi lambda tersedia untuk kode ekspresi) ekspresi Lambda pada dasarnya adalah gula sintaksis untuk fungsi inline.

Daftar nilai di sebelah kiri operator produksi ("=>") memberikan kontribusi struktur dan konten dari bingkai tumpukan yang digunakan untuk melakukan panggilan ke fungsi ini. Anda bisa mengatakan bahwa daftar nilai berkontribusi baik deklarasi parameter dan argumen yang dikirimkan; dalam kode yang lebih konvensional, ini menentukan struktur dan konten bingkai tumpukan yang digunakan untuk melakukan panggilan ke suatu fungsi.

Akibatnya, nilai-nilai "pergi ke" kode ekspresi. Apakah Anda lebih suka mengatakan "menentukan bingkai tumpukan untuk" atau "pergi ke"? :)

Dalam penerapan ekspresi boolean yang didefinisikan secara sempit yang digunakan sebagai kondisi filter (penggunaan dominan ekspresi lambda yang dipertimbangkan secara luas oleh jawaban lain untuk pertanyaan ini), sangat masuk akal untuk melewatkan metode yang mendukung maksud kode, dan ini mengarah pada " untuk yang "sama ringkas dan mengatakan lebih banyak tentang arti kode.

Namun, ekspresi lambda bukan satu-satunya provinsi Linq dan di luar konteks ini bentuk yang lebih umum "pergi ke" harus digunakan.


Tapi mengapa "pergi ke"?

Karena "mengisi bingkai tumpukan kode berikut" terlalu lama untuk terus mengatakannya. Saya kira Anda bisa mengatakan "dilewatkan ke".

Perbedaan penting antara parameter yang diteruskan secara eksplisit dan variabel yang ditangkap (jika saya ingat dengan benar - perbaiki saya jika saya salah) adalah bahwa yang pertama dilewatkan dengan referensi dan yang terakhir dengan nilai.

Peter Wone
sumber
1
Saya tidak melihat persis bagaimana kesimpulan Anda mengikuti diskusi Anda. Di sisi lain, saya pikir mengkarakterisasi => dalam hal bagaimana penutupan mungkin (atau mungkin tidak) diterapkan bukan cara yang baik untuk memahami pertanyaan yang ditanyakan.
orcmid
Paragraf pertama menyesatkan. Ekspresi Lambda adalah konstruksi kelas satu. Fungsi inlining adalah optimasi. Paragraf terakhir lebih dari itu. Variabel terikat dalam ekspresi lambda (apa yang Anda sebut "variabel yang ditangkap"), tidak diteruskan ke mana pun. Mereka kemas dan ditambahkan sebagai bagian dari objek lambda. Jika dilewati, Anda harus menyebutkannya lagi - untuk menyebutkan satu perbedaan.
Neowizard
1

Sebagian dari masalahnya adalah Anda dapat membacanya dengan keras tergantung pada bagaimana strukturnya. Ini memalukan itu tidak secantik atau seintegrasi ruby ​​|

Tad Donaghe
sumber
Bagaimana menurutmu |? Sama seperti pipa?
dtc
Sulit menemukan panduan apa pun tentang ini, tetapi _mengapa menggunakan "ambil masing-masing," yaitu People.each {| person | menempatkan person.name} menjadi "Dengan Orang mengambil setiap orang dan mencetak nama"
Adam Lassek
1

Di Ruby, sybmol yang sama ini disebut "hashrocket," dan saya pernah mendengar programmer C # menggunakan istilah itu juga (walaupun itu salah).

Faring
sumber
0

Dua sen saya:

s => s.Age > 12 && s.Age < 20

"Ekspresi Lambda dengan parameter s adalah { return s.Age > 12 && s.Age < 20;}"

Saya suka ini karena mengingatkan saya di mana ekspresi lamdba berasal

delegate(Student s) { return s.Age > 12 && s.Age < 20; };

=> hanyalah jalan pintas sehingga Anda tidak harus menggunakan kata kunci delegasi dan memasukkan info jenis karena dapat disimpulkan oleh kompiler.

Allan
sumber
0

Istilah saya untuk => sebagaimana diterapkan pada contoh hasil yang ditunjukkan

'result = s => s.Age > 12 && s.Age < 20'

di mana s.Age lebih besar dari 12 dan s.Age kurang dari 20

'result = x => x * 2'

x di mana x dikalikan 2

'result = c => c.City == "London"'

c di mana c.city setara dengan "London"

'result = n => n == String.Empty'

n di mana n adalah string kosong

Arthur
sumber