Apakah ekspresi perhitungan sama dengan monad?

22

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.

Grzegorz Sławecki
sumber
@ Raphael, bolehkah saya bertanya apa alasan untuk menghapus tag lang?
Grzegorz Sławecki
2
Karena kami peduli dengan konsep, kami mencoba untuk menjaga banyak hal agnostik bahasa di sini. Saya tidak tahu apa yang menghapus F # lakukan untuk pertanyaan ( saya pikir jika penting bahwa F # maka pertanyaannya adalah offtopic di sini, tetapi ini merupakan kasus batas) jadi saya hanya menghapus tag F #. Rule of thumb: F # bukan konsep CS, jadi tidak perlu tag. (Ya, saya mengetahui tag PL lainnya dan saya juga tidak suka. Untuk beberapa pertanyaan, komunitas telah memutuskan bahwa mereka menjamin tag ini.)
Raphael
1
@ Raphael Saya yakin pertanyaannya memang kasus perbatasan. Seseorang memutuskan untuk memigrasikannya di sini, tetapi sepertinya ini juga agak off topic di sini. Pertanyaan itu sendiri adalah jenis komputer sejak itu, tetapi pada saat yang sama baik jawaban dan pertanyaan secara khusus terkait dengan f #. Saya mengerti aturan praktis Anda, terima kasih atas klarifikasi
Grzegorz Sławecki

Jawaban:

22

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:

  • Monads, tetapi juga monit tambahan (apa yang disebut MonadPlusatau disebut Haskellers MonadOr)
  • Komputasi yang dikomposisikan (apa yang Haskellers sebut transformer monad)
  • Komputasi yang monadik, tetapi mendukung konstruksi F # lainnya seperti penanganan pengecualian
  • Monoids (dan beberapa variasi tanpa ikatan monadik)
  • Fungsional yang berlaku (meskipun ini hanya diimplementasikan dalam ekstensi penelitian)

Jadi, ekspresi perhitungan tentu saja terkait erat dengan monad, tetapi mereka tidak terkait dengan mereka secara dekat. Ini kontras misalnya dengan donotasi Haskell , yang jauh lebih terkait erat dengan monad (meskipun bahkan itu dapat digunakan dengan perhitungan yang bukan monad matematis).

Tomas Petricek
sumber
3
Transformer Monad adalah cara umum untuk mengubah satu monad menjadi monad lain - ekspresi perhitungan F # hanya benar-benar mendukung langsung implementasi / hasil / dari transformasi itu, daripada transformasi itu sendiri.
GS - Minta maaf kepada Monica
1
@ GaneshSittampalam - Ya, Anda benar. Upaya saya untuk menyederhanakan tidak terlalu berguna di sini :-). Ekspresi komputasi dapat memberikan Anda sintaks untuk bekerja dengan perhitungan yang merupakan hasil dari penerapan trafo monad (dengan sintaksis yang berpotensi berbeda untuk monad yang mendasarinya dan untuk monad yang dikomposisikan)
Tomas Petricek
5

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.

N_A
sumber
1
Harap buat jawaban Anda lebih lengkap dengan setidaknya merangkum materi pada halaman yang Anda tautkan. Jawaban Anda saat ini akan sama sekali tidak berarti jika kedua tautan berhenti bekerja.
David Richerby
2
Saya tidak yakin apa yang Anda bicarakan. Saya secara eksplisit menjawab pertanyaan dan kemudian memberikan tautan ke informasi lebih lanjut jika penanya tertarik. Tautan tidak diperlukan untuk menjawab pertanyaan.
N_A
1
Saya bahkan tidak dapat membayangkan bahwa kedua tautan tersebut dapat berhenti bekerja :-)
Tomas Petricek