Pola desain fungsional [tertutup]

106

Ada banyak idiom fungsional: monad, aplikatif, panah, dll. Mereka didokumentasikan dalam artikel yang berbeda tetapi sayangnya saya tidak tahu buku atau artikel mana pun yang diringkas di satu tempat (ada Typeclassopedia tetapi memiliki banyak area yang tidak tercakup dengan baik). Adakah yang bisa merekomendasikan artikel / buku yang mencakup mereka dengan baik di satu tempat dan yang dapat diakses oleh programmer dengan keterampilan menengah di FP?

Konstantin Solomatov
sumber
Itu tidak langsung menjawab pertanyaan Anda tetapi pertanyaan lain ini memiliki beberapa info menarik (dan setidaknya satu atau dua tautan): stackoverflow.com/questions/327955/…
reuben
15
Bisakah Anda memperluas area mana yang menurut Anda Typeclassopedia tidak tercakup dengan baik?
dave4420
2
@ dave4420 Jika saya membaca typeclassopedia dari awal sampai akhir, semakin banyak saya membaca, semakin sedikit saya mengerti. Bagian pertama sangat bagus tetapi bagian terakhir sulit dibaca oleh saya.
Konstantin Solomatov
3
@KonstantinSolomatov mungkin Anda perlu meneliti bagian yang tidak Anda pahami, melihat postingan blog, dan melihat kodenya dengan cermat. semua "pola desain" dalam typeclassopedia ini benar-benar abstraksi, dan seringkali pola mendalam, yang terkadang membutuhkan waktu untuk dipahami.
jberryman
1
@DanBurton tidak yakin apakah Anda salah membaca komentar saya, tetapi saya akan mengkategorikan semua itu sebagai abstraksi yang dalam, meskipun mudah untuk melupakannya ketika Anda memiliki "Ah ha!" saat.
jberryman

Jawaban:

35

Saran saya, jika Anda ingin belajar Scala, bacalah buku dari Paul Chiusano dan Runar Bjarnason:

http://manning.com/bjarnason/

Bagian II: Desain fungsional dan perpustakaan kombinator

  1. Membuat bahasa kecil
  2. Serialisasi JSON
  3. Pengujian berbasis spesifikasi
  4. Parser
  5. Paralelisme murni fungsional
  6. Keadaan fungsional murni

Bagian III: Pola desain fungsional

  1. Kasus untuk abstraksi
  2. Monoid
  3. Functor
  4. Monads
  5. Fungsi aplikatif
  6. Struktur data yang dapat dilintasi dan dilipat
  7. Comonads

Bagian IV: Melanggar aturan: efek dan I / O

  1. Efek vs. efek samping
  2. Pemrosesan streaming dan I / O tambahan
  3. Menerapkan cakupan efek dengan sistem tipe
Edmondo 1984
sumber
31

Maaf, saya tidak tahu artikel atau buku yang membahas secara rinci perbedaan penggunaan untuk semua konstruksi tersebut, tetapi saya dapat memberi Anda beberapa tautan ke sumber daya individu.

Pola yang cukup umum adalah membangun trafo monad daripada monad sederhana (lihat juga tautan di paragraf berikutnya). Ini pada dasarnya berarti Anda membangun sesuatu yang harus dikombinasikan dengan monad lain, menghasilkan monad yang lebih kompleks yang mampu menangani fitur keduanya.

Di Real World Haskell ada beberapa bab tentang monad. Pada Bab 14. Monads penulis menjelaskan dasar-dasar dan beberapa penggunaan umum (mungkin, daftar, status). Bab 15. Pemrograman dengan monad memberikan lebih banyak penjelasan tentang bagaimana menggunakannya secara efektif (ini mencakup pembaca monad juga). Bab berikut menjelaskan cara menggunakan Parsec , tetapi mungkin lebih menarik untuk mencari artikel yang membahas cara kerjanya: ini harus menjadi contoh yang sangat baik dari penggunaan monad yang terorganisir dengan baik untuk penguraian. Fianlly, Bab 18. Transformator monadmemperkenalkan cara kerja trafo monad dan kemudian menunjukkan cara membuatnya, selangkah demi selangkah. Pertimbangan terhadap bagian terakhir dari bab ini juga menarik.

Saya pernah membaca pertanyaan yang sangat menarik tentang SO tentang penggunaan kreatif monad . Tautan yang diusulkan adalah bacaan yang luar biasa tentang topik tersebut. Dengan semangat itu, saya mencoba menanyakan hal yang sama untuk panah : Saya pasti mendapat jawaban yang lebih sedikit daripada yang ada di monad, tapi tetap saja yang menarik.


Sehubungan dengan pola OOP oleh kelompok berempat, ada satu set bagus dari 3 artikel oleh IBM tentang topik dalam seri pemikiran fungsional mereka . Bahasa fungsional target adalah Scala. Mereka melanjutkan dengan menjelaskan pola desain biasa di OOP dan menunjukkan bagaimana mereka memetakannya ke dalam Scala.

  1. Pemikiran fungsional: Pola desain fungsional, Bagian 1 . Di sini mereka mencakup pabrik, metode templat, strategi, kelas terbang. Intinya adalah dengan memiliki fungsi sebagai nilai kelas satu, semuanya jauh lebih sederhana.
  2. Pemikiran fungsional: Pola desain fungsional, Bagian 2 . Ini tentang java dan groovy . Ini alamat pola adaptor.
  3. Pemikiran fungsional: Pola desain fungsional, Bagian 3 . Di sini mereka berbicara tentang pola penafsir. Sekali lagi, bahasa targetnya asyik.

Artikel yang paling relevan dengan pertanyaan Anda pasti yang pertama, tapi dua lainnya mungkin bacaan terkait yang menarik.

Riccardo T.
sumber
Terima kasih, tapi maksud saya berbagai jenis pola, seperti Monad, Panah, Aplikatif tanpa pola GoF.
Konstantin Solomatov
@KonstantinSolomatov: Saya salah paham dengan pertanyaan Anda, maaf. Saya menambahkan beberapa referensi untuk monad dan panah.
Riccardo T.
18

Jeremy Gibbons memiliki blog Patterns in FP yang pada akhirnya ditakdirkan untuk menjadi buku yang Anda minta. Tentu saja, itu belum dalam kondisi berguna seperti yang mungkin Anda inginkan sekarang, tetapi dia layak mendapatkan dorongan!

Sementara itu, saya akan mengatakan +1 untuk Typeclassopedia Brent Yorgey. Ini sangat berguna, dan jika nanti ada bagian yang membingungkan, situs ini adalah tempat yang baik untuk membukanya. Saya tahu Brent terus mengkaji. Jika dia tidak menjangkau pembacanya, beri dia bantuan.

pekerja babi
sumber
5

Sudahkah Anda membaca bab-bab selanjutnya dari Learn You a Haskell for Great Good ?

  • Bab 6 mencakup peta dan lipatan, yang merupakan dua "pola desain" yang lebih penting dalam bahasa fungsional.

  • Bab 11-13 mencakup Functor, Functor Aplikatif, dan Monad, dalam urutan itu. Ini berguna - banyak tutorial memperkenalkan Functors dan kemudian Monads, dan kemudian membahas Functor Aplikatif di akhir (jika mereka membahasnya sama sekali). Urutan di LYAH lebih baik, karena bergerak dari Functor => Functor Aplikatif => Monads memindahkan Anda secara bertahap ke atas tangga umum dan kekuasaan.

  • Bab 14 mencakup Zippers - Anda dapat secara efektif menganggap ini sebagai kelas kontainer dengan penunjuk ke bagian data tertentu, yang berarti Anda mendapatkan akses O (1) dan memperbarui di lokasi penunjuk.

Itu tidak mencakup Panah atau Komonad, yang merupakan topik lanjutan di Haskell. Untuk memahami bagaimana dan mengapa menggunakan Arrows atau Comonads, Anda pasti sudah memiliki pemahaman yang kuat tentang Monads, jadi menurut saya ini bukan masalah - LYAH dengan tegas ditujukan untuk pemula di pasar Haskell.

Chris Taylor
sumber
1
Ya, saya membaca buku itu. Saya sangat menyukainya. Sayangnya itu tidak menyembunyikan panah dan banyak pola lanjutan lainnya. Saya juga ingin membaca lebih lanjut tentang Monad dan Aplikatif (misalnya, LYHGG tidak mencakup monad lanjutan).
Konstantin Solomatov