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).
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.
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{caseSome...
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.)
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.
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.
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.
for
ekspresi dalam referensi bahasa. Ini mungkin memberi beberapa petunjuk.Jawaban:
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.
sumber
Kisah yang saya dengar adalah bahwa dua pemrogram Scala terkemuka berpasangan ketika salah satu dari mereka mulai menulis beberapa kode seperti ini:
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 (sepertiOption
, koleksi, dll.), Kelanjutan, status, dll. Kedua, saat Anda dapat melakukan de-konstruksiOption
, yang, bukanflatMap
, 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.)sumber
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 menjadiString
, tetapi menjadiOption[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.Hal yang terpenting
flatMap
adalah 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.sumber
Option
hanya salah satu dari banyakflatMap
kasus 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!"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.
sumber