Baru-baru ini saya telah membuang pengetahuan saya tentang cara kerja Monads. Saya juga telah diperkenalkan dengan konsep 'Comonad' , yang digambarkan sebagai dua kebalikan dari monad . Namun, saya tidak mungkin membungkus kepala saya di sekitarnya.
Untuk memahami Monads, saya membuat analogi sendiri untuk diri saya sendiri:
Monads dapat dilihat sebagai 'cetak biru untuk membangun ban berjalan ekspresi'.
Untuk mendefinisikan Monad baru (sistem conveyor-belt jenis baru), Anda perlu mendefinisikan:
- Cara untuk meletakkan sesuatu di sabuk konveyor, misalnya 'memulai' sabuk konveyor. (Dikenal sebagai
unit
ataureturn
)- Cara menghubungkan mesin (ekspresi) yang akan menjadi bagian dari ban berjalan ke ban berjalan. (Dikenal sebagai
join
ataubind
atau>>=
).(Ada operasi ketiga yang mengambil sabuk konveyor saat ini, membuang isinya dan memulai sabuk konveyor baru yang dikenal sebagai
>>
, tetapi sangat jarang digunakan.)Agar mesin dan konveyor dapat bekerja dengan baik bersama-sama, Anda harus memastikan bahwa:
- Jika Anda meletakkan sesuatu di sabuk konveyor dan melewatkannya melalui mesin, hasilnya harus sama seperti ketika Anda melewatkannya melalui mesin secara manual. (Identitas Kiri)
- Jika Anda ingin meletakkan sabuk konveyor di antara sabuk konveyor yang sudah ada, Anda tidak boleh berakhir dengan sabuk konveyor yang memiliki sabuk konveyor di bagian atas, melainkan sabuk konveyor yang lebih panjang dan tunggal. (Identitas Benar)
- Seharusnya tidak masalah untuk output jika Anda secara manual menggunakan mesin A, dan kemudian meneruskan hasilnya melalui BC yang terhubung dengan conveyor, atau jika Anda menggunakan AB yang terhubung dengan conveyor dan kemudian meneruskan hasilnya secara manual melalui C. Dengan kata lain: ((a >> = b) >> = c) harus sama dengan (a >> = (b >> = c)) (Asosiatif)
Belt conveyor yang paling sederhana adalah yang hanya mengambil input dan selalu melanjutkan ke ekspresi berikutnya. Inilah yang dimaksud dengan 'pipeline'.
Kemungkinan lain, adalah hanya membiarkannya melalui mesin berikutnya jika beberapa kondisi terpenuhi untuk nilai. Ini berarti bahwa jika pada beberapa ekspresi di antaranya, nilainya berubah menjadi sesuatu yang tidak lagi diizinkan, maka sisa ekspresi akan dilewati. Inilah yang dilakukan monad 'Mungkin' di Haskell.
Anda juga dapat melakukan aturan salin / ubah kondisional lainnya pada nilai sebelum atau setelah Anda menyerahkannya ke mesin. Contoh: Parsers (Di sini, jika ekspresi mengembalikan hasil 'kegagalan', nilai dari sebelum ekspresi digunakan sebagai output).
Tentu saja analoginya tidak sempurna, tapi saya harap ini memberikan gambaran yang baik tentang bagaimana monad bekerja.
Namun, saya memiliki banyak kesulitan untuk mengubah analogi ini di kepalanya untuk memahami Comonads. Saya tahu dari sejumlah kecil informasi yang saya temukan di internet yang didefinisikan oleh Comonad:
extract
, Yang merupakan semacam kebalikan darireturn
, yang, dibutuhkan nilai keluar dari Comonad.duplicate
, Yang merupakan jenis kebalikan darijoin
, yaitu, ia menciptakan dua Comonads dari satu.
Tetapi bagaimana Comonad dapat dipakai jika kita hanya dapat mengekstrak dari mereka atau menduplikasi mereka? Dan bagaimana mereka bisa digunakan? Saya telah melihat proyek yang sangat luar biasa ini dan pembicaraan tentang hal itu (yang sayangnya saya mengerti sangat sedikit), tetapi saya tidak yakin bagian mana dari fungsi yang disediakan oleh Comonad sebenarnya.
Apa itu Comonad? Apa manfaatnya? Bagaimana mereka bisa digunakan? Apakah bisa dimakan?
IO
monad adalah sistem runtime Haskell, yang digunakan main
. Tentu unsafePerformIO
saja ada. Jika Anda ingin menganggap Maybe
monad memiliki "mesin di ujung ban berjalan" yang dapat Anda gunakan maybe
.
cobind
aplikasi, harus ada beberapa fungsi yang melakukan sesuatu yang berguna dengan representasi internal comonad Anda.