Saya masih belajar pemrograman fungsional (dengan f #) dan saya baru-baru ini mulai membaca tentang ekspresi komputasi. Saya masih belum sepenuhnya memahami konsep dan satu hal yang membuat saya tidak yakin ketika membaca semua artikel tentang Monad (kebanyakan dari mereka ditulis berdasarkan Haskell) adalah hubungan antara ekspresi perhitungan dan Monad.
Setelah menulis semua itu, inilah pertanyaan saya (sebenarnya dua pertanyaan):
Apakah setiap ekspresi perhitungan F # adalah monad? Bisakah setiap monad diekspresikan dengan ekspresi perhitungan F #?
Saya sudah membaca ini posting dari Tomas Petricek dan jika saya mengerti dengan baik, ia menyatakan bahwa ekspresi perhitungan lebih dari monads, tapi aku tidak yakin apakah saya menafsirkan ini dengan benar.
sumber
Jawaban:
Pertama-tama, ekspresi perhitungan adalah fitur bahasa, sedangkan monad adalah abstraksi matematis, jadi dari sudut pandang ini, mereka adalah hal yang sama sekali berbeda .
Tapi itu tidak akan menjadi jawaban yang sangat berguna :-). Ekspresi komputasi adalah fitur bahasa yang memberi Anda sintaks yang dapat digunakan untuk pemrograman dengan komputasi (atau tipe data) yang memiliki struktur monadik, tetapi mereka juga dapat digunakan dengan struktur lain. Anda dapat membaca kertas kebun binatang ekspresi F # untuk detail lebih lanjut, tetapi ekspresi perhitungan dapat digunakan dengan:
MonadPlus
atau disebut HaskellersMonadOr
)Jadi, ekspresi perhitungan tentu saja terkait erat dengan monad, tetapi mereka tidak terkait dengan mereka secara dekat. Ini kontras misalnya dengan
do
notasi Haskell , yang jauh lebih terkait erat dengan monad (meskipun bahkan itu dapat digunakan dengan perhitungan yang bukan monad matematis).sumber
Anda dapat menggunakan ekspresi komputasi untuk mengekspresikan monad. Ada contoh di sini . Juga, seperti yang Anda catat, Anda dapat menggunakan ekspresi komputasi untuk lebih dari sekadar monad. Ada penjelasan panjang lebar tentang bagaimana mereka berbeda di sini . Tidak ada ruang di sini untuk menjelaskan perbedaan dengan benar, tetapi ekspresi perhitungan berbeda dari monads karena mereka menggunakan kembali sintaks F # normal dan memiliki kemampuan untuk menambahkan abstraksi tambahan. Keterbatasan adalah bahwa itu non-idiomatik (dan sulit) untuk menulis ekspresi perhitungan yang polimorfik atas jenis perhitungan.
sumber