Apa cara yang baik untuk merancang / menyusun program fungsional besar, terutama di Haskell?
Saya telah melalui banyak tutorial (Write Yourself a Scheme menjadi favorit saya, dengan Real World Haskell dekat kedua) - tetapi sebagian besar program relatif kecil, dan tujuan tunggal. Selain itu, saya tidak menganggap beberapa dari mereka sangat elegan (misalnya, tabel pencarian luas di WYAS).
Saya sekarang ingin menulis program yang lebih besar, dengan lebih banyak bagian yang bergerak - memperoleh data dari berbagai sumber yang berbeda, membersihkannya, memprosesnya dengan berbagai cara, menampilkannya dalam antarmuka pengguna, bertahan, berkomunikasi melalui jaringan, dll. Bagaimana mungkin satu struktur kode terbaik agar dapat dibaca, dipelihara, dan mudah beradaptasi dengan perubahan persyaratan?
Ada cukup banyak literatur yang membahas pertanyaan-pertanyaan ini untuk program imperatif berorientasi objek besar. Ide-ide seperti MVC, pola desain, dll. Adalah resep yang layak untuk mewujudkan tujuan luas seperti pemisahan masalah dan penggunaan kembali dalam gaya OO. Selain itu, bahasa imperatif yang lebih baru memberikan gaya refactoring 'desain saat Anda tumbuh' yang, menurut pendapat pemula saya, Haskell tampaknya kurang cocok.
Apakah ada literatur yang setara untuk Haskell? Bagaimana kebun binatang struktur kontrol eksotis tersedia dalam pemrograman fungsional (monad, panah, aplikatif, dll.) Paling baik digunakan untuk tujuan ini? Praktik terbaik apa yang bisa Anda rekomendasikan?
Terima kasih!
EDIT (ini merupakan tindak lanjut dari jawaban Don Stewart):
@dons disebutkan: "Monads menangkap desain arsitektur utama dalam beberapa tipe."
Saya kira pertanyaan saya adalah: bagaimana seharusnya orang berpikir tentang desain arsitektur utama dalam bahasa fungsional murni?
Pertimbangkan contoh beberapa aliran data, dan beberapa langkah pemrosesan. Saya bisa menulis parser modular untuk aliran data ke sekumpulan struktur data, dan saya bisa menerapkan setiap langkah pemrosesan sebagai fungsi murni. Langkah-langkah pemrosesan yang diperlukan untuk satu bagian data akan tergantung pada nilainya dan yang lainnya. Beberapa langkah harus diikuti oleh efek samping seperti pembaruan GUI atau permintaan basis data.
Apa cara 'Benar' untuk mengikat data dan langkah-langkah parsing dengan cara yang baik? Orang bisa menulis fungsi besar yang melakukan hal yang benar untuk berbagai tipe data. Atau seseorang dapat menggunakan monad untuk melacak apa yang telah diproses sejauh ini dan meminta setiap langkah pemrosesan mendapatkan apa pun yang dibutuhkan berikutnya dari keadaan monad. Atau orang dapat menulis sebagian besar program terpisah dan mengirim pesan (saya tidak suka opsi ini).
Slide yang ditautkannya memiliki peluru Hal yang Kita Butuhkan: "Idiom untuk memetakan desain ke tipe / fungsi / kelas / monad". Apa idiomnya? :)