The IO
monad di Haskell sering dijelaskan sebagai monad negara di mana negara adalah dunia. Jadi nilai tipe IO a
monad dipandang sebagai sesuatu seperti worldState -> (a, worldState)
.
Beberapa waktu yang lalu saya membaca artikel (atau posting blog / milis) yang mengkritik pandangan ini dan memberikan beberapa alasan mengapa itu tidak benar. Tetapi saya tidak dapat mengingat baik artikel maupun alasannya. Adakah yang tahu?
Sunting: Artikel ini sepertinya hilang, jadi mari kita mulai mengumpulkan berbagai argumen di sini. Saya memulai hadiah untuk membuat hal-hal lebih menarik.
Sunting: Artikel yang saya cari adalah Menangani skuad canggung: input / output monadik, konkurensi, pengecualian, dan panggilan bahasa asing di Haskell oleh Simon Peyton Jones. (Terima kasih atas jawaban TacTics.)
sumber
Jawaban:
Masalahnya
IO a = worldState -> (a, worldState)
adalah jika ini benar maka kita bisa membuktikannyaforever (putStrLn "Hello") :: IO a
danundefined :: IO a
sama. Berikut adalah bukti milik dolio (2010, irc):Kata pengantar singkat:
(\r w -> r (snd $ m w)) ⊥ = ⊥
Karena itu
forever m = fix (\r -> \w -> r (snd $ m w)) = ⊥
Secara khusus
forever (putStrLn "Hello") = ⊥
dan karenanyaforever (putStrLn "Hello")
danundefined
adalah program yang setara. Namun, jelas mereka tidak seharusnya dianggap sebagai program yang setara, secara teori atau dalam praktik.Perhatikan bahwa model ini salah bahkan tanpa meminta konkurensi.
sumber
undefined
semantik murni Haskell? Berbagai supposeds seharusnya tidak dapat dibedakan dalam semantik murni Haskell! Tetapi ketika kita memikirkan secara operasional tentang program-program kita, kita juga ingin membedakan berbagai jenis ⊥, bahkan ketikaIO
tidak terlibat; Saya peduli apakah program saya melempar pengecualian atau memasuki infinite loop, bahkan jika Anda dapat membuktikan bahwa keduanya sama dengan membuktikan bahwa keduanya ⊥. Itu sebenarnya bukan kontradiksi.forever (putStrLn "Hello")
tentu saja tidak seperti[0,1..]
. Bukti Anda tidak khusus untukworldState
, oleh karena itu juga berlaku untuk keadaan umum monad. Jadiforever (someModificationWith "Hello")
juga secara denotasional setara dengan ⊥. Saya sama sekali tidak terkejut dengan hasil itu; itu tidak produktif dalam semantik denotasional, dan apa yang dilakukan komputer secara operasional sementara kita menunggu selamanya tidak relevan. Hal yang sama untukforever (putStrLn "Hello")
; itu tidak dan tidak seharusnya menghasilkan negara dunia baru yang entah bagaimana bisa kita konsumsi dengan malas.Inilah jawaban yang sepele: perubahan apa pun pada negara bagian monad adalah karena tindakan apa pun yang dijalankan dalam monad. Jika memang penjelasan "WorldState -> (a, WorldState)" mengklaim properti yang sama, dengan WorldState menjadi nilai murni yang hanya diubah oleh IO monad, itu salah. Perubahan waktu, konten file, status pegangan, dll. Dapat berubah secara independen dari apa yang terjadi di monad IO. Itulah inti dari mono IO. Fakta bahwa GHC melewati sekitar nilai RealWorld (atau w / e itu) di bawahnya adalah untuk memastikan semuanya berjalan sesuai urutan, sejauh yang saya tahu, jika itu (mungkin hanya sesuatu yang dimasukkan ke dalam nilai ST).
sumber
Saya menulis posting blog dengan topik bagaimana memodelkan IO sebagai bentuk coroutine asimetris yang berkomunikasi dengan sistem runtime untuk bahasa Anda. (Ini diakui sebagai bagian ketiga dari seri)
http://comonad.com/reader/2011/free-monads-for-less-3/
Tulisan itu mencakup sedikit mengapa canggung untuk beralasan tentang semantik 'pelintas dunia'.
sumber
Lihat Menangani Pasukan Canggung .
Alasan utama adalah model negara RealWorld dari monad IO tidak bekerja dengan baik dengan konkurensi. SPJ dalam bantuan klasik yang dapat dibaca ini menggunakan semantik operasional untuk memahaminya.
sumber
Keluhan utama tentang model negara RealWorld adalah bahwa, seperti yang dikatakan TacTics, pelintasan dunia tidak selalu bekerja dengan konkurensi. Tetapi Wouter Swierstra dan Thorsten Altenkirch menunjukkan bagaimana alasan tentang konkurensi sebagai efek "kelewat dunia", dengan urutan yang tetap namun sewenang-wenang dari benang-benang interleaving dalam makalah mereka "Beauty in the Beast: Sebuah Fungsional Fungsional untuk Pasukan Awkward": http : //www.staff.science.uu.nl/~swier004/Publications/BeautyInTheBeast.pdf
Kode yang sesuai dengan ini ada di Hackage as IOSpec: http://hackage.haskell.org/package/IOSpec
Saya pikir tesis Wouter lebih rinci: http://www.staff.science.uu.nl/~swier004/Publications/Thesis.pdf
sumber