Dari manakah ekspresi idiomatik “flatmap that s ***” di Scala berasal?

104

Apa yang begitu kuat tentang peta datar sehingga layak mendapat tempat seperti itu dalam cerita rakyat Scala?

Guillaume Belrose
sumber
30
[butuh rujukan]
tstenner
1
Bacalah bagian tentang bagaimana kompilator menangani forekspresi dalam referensi bahasa. Ini mungkin memberi beberapa petunjuk.
Dirk
@tstenner: Selama kita bersandar pada meme singkat: Google adalah teman Anda.
Chuck
4
@aishwarya Ini lebih seperti "Cukup gunakan peta datar pada daftar / larik / opsi Anda", bukan "sial" seperti dalam "buruk"
tstenner
1
Sebenarnya, frase spesifik itu (tentu saja) diambil di luar konteks, di mana seseorang melewatkan monad Bar (Reader) di suatu tempat di Manhattan ;-) Seperti yang terjadi dalam kasus seperti itu, versi singkatnya macet.
Roland Kuhn

Jawaban:

55

Alasan di balik frasa ini adalah Anda dapat mengganti banyak kode if / then / else membosankan yang akan Anda tulis dengan panggilan ke flatMap (dan fungsi tingkat tinggi lainnya).

Ini terutama berlaku untuk Opsi (lihat http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )

Tetapi itu juga berlaku untuk monad lain (meskipun saya harus mengakui, saya sendiri belum sepenuhnya memahami detailnya)

Bayangkan situasi di mana Anda memiliki koleksi yang ingin Anda terapkan fungsi (atau serangkaian fungsi) di mana setiap fungsi mungkin mengembalikan null. Ketika Anda benar-benar menggunakan nol, kode Anda akan dipenuhi dengan pemeriksaan nol. Tetapi jika Anda menggunakan Opsi alih-alih nilai, Anda bisa memetakan nilai-nilai dengan fungsi yang diinginkan, merangkai fungsi dalam kasus beberapa fungsi dan mendapatkan koleksi hanya dengan hasil yang bukan null, yang dalam banyak kasus persis seperti itu. kamu ingin.

Karena deskripsi itu agak berbelit-belit, saran yang lebih pendek "hanya peta datar yang omong kosong" menjadi mapan.

Jens Schauder
sumber
Saya pribadi menggunakan daftar monad kadang-kadang untuk menangani kombinasi.
Dan Burton
103

Kisah yang saya dengar adalah bahwa dua pemrogram Scala terkemuka berpasangan ketika salah satu dari mereka mulai menulis beberapa kode seperti ini:

option match {
    case Some ...

Pada titik mana yang lain berkata, "Apa ini? Jam amatir? Peta datar, sialan!"

Mengenai apa yang begitu kuat tentang flatMap, yah ... Pertama, ini adalah operator monadik fundamental. Artinya, ini adalah operasi umum yang digunakan bersama oleh, misalnya, kontainer (seperti Option, koleksi, dll.), Kelanjutan, status, dll. Kedua, saat Anda dapat melakukan de-konstruksi Option, yang, bukan flatMap, bukan operasi monadik , sehingga tidak bisa diterapkan secara luas. Selain itu, diperlukan terlalu banyak pengetahuan tentang data yang Anda manipulasi.

Catatan: sebelumnya saya mengatakan bahwa mencocokkan lebih lambat dari flatMap- sebaliknya kenyataannya, hingga versi terbaru Scala pada saat penulisan ini, 2.10.1.)

Daniel C. Sobral
sumber
4
Saya kira saya masih di jam amatir maka :-)
Guillaume Belrose
69
Kedua programmer itu adalah saya dan Paul Chiusano.
Apocalisp
1
Jika saya ingat dengan benar, bukankah #legendofklang memanifestasikan dirinya di twitter sekitar waktu yang sama ... yang sering kali merupakan akar dari kesalahan atribusi peta datar yang meme sialan itu? Kita harus membuat semacam entri wiki Scala meme; ada beberapa yang keren sekarang!
timothy
3
@WillSargent Saya pikir itu kehilangan hutan untuk pepohonan. Keuntungannya adalah ia mengarang . Jika saya memiliki fungsi yang bergantung pada empat monad, saya dapat menulis val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d). Saya dapat menambahkan lebih banyak monad, menghapus monad, dan itu tetap sama. Juga, perhatikan bahwa itu tidak terurai menjadi String, tetapi menjadi Option[String]. Padahal, sebenarnya, itu tidak membusuk sama sekali. Salah satu alasan mengapa beberapa orang tidak suka menggunakan container sebagai contoh untuk monad adalah karena Anda dapat mengeluarkan barang dari container, tetapi tidak semua monad mengizinkan Anda melakukannya.
Daniel C. Sobral
1
Anda dapat melihat link ke diskusi yang dikutip di sini: web.archive.org/web/20130627111326/http://beust.com/weblog/2010/...
Hawkeye
12

Hal yang terpenting flatMapadalah bahwa Scala merupakan representasi dari operasi pengikatan monadik. Ada banyak tutorial di web yang menjelaskan tujuan monad dan mengapa sebenarnya sangat berguna; James Iry punya satu hal yang menjelaskan beberapa detail.

Submonoid
sumber
4
Saya pikir ini adalah jawaban yang benar, Optionhanya salah satu dari banyak flatMapkasus penggunaan. Tentu saja, jika Anda ingin mengamati monad di "habitat aslinya", Anda harus mengunjungi Haskell. Satu-satunya perbedaan adalah Haskeller berkata: "Hanya >> = omong kosong itu!"
Landei
Terima kasih untuk tautan ke artikelnya, saya merasa sangat berguna. Saya juga kembali ke bab "Untuk ekspresi yang ditinjau kembali" dalam Pemrograman di Scala yang menjelaskan tentang loop dan penggunaan filter, map, flatMap, dan flatten.
Guillaume Belrose
10

Runar Bjarnason adalah orang yang Anda cari asal-usulnya.

Menyadari mengapa hal itu begitu kuat adalah sesuatu yang hanya bisa terjadi seiring berjalannya waktu. Kelas Option adalah tempat terbaik untuk memulai untuk melihat bagaimana Anda akan berulang kali flatMap serangkaian pencarian (misalnya) menjadi hasil akhir.

Sean Parsons
sumber