Dünyada faaliyet gösteren bir devlet monadı olarak görülen IO monadının eleştirisi


46

IOHaskell monad genellikle devlet dünya bir devlet monad olarak açıklanmıştır. Dolayısıyla IO amonad tipi bir değer gibi gözüküyor worldState -> (a, worldState).

Bir süre önce bu görüşü eleştiren ve doğru olmamanın birkaç nedeni olan bir makale (ya da bir blog / posta listesi yazısı) okudum. Ancak ne makaleyi ne de sebeplerini hatırlayamıyorum. Bilen var mı

Düzenleme: Makale kaybolmuş görünüyor, bu yüzden burada çeşitli argümanlar toplamaya başlayalım. İşleri daha ilginç hale getirmek için bir ödül alıyorum.

Düzenleme: Aradığım makale , Garip takımın ele alınması: Haskell'de monadik giriş / çıkış, eşzamanlılık, istisnalar ve yabancı dil çağrılarını Simon Peyton Jones. (TacTics'in cevabı sayesinde.)


1
Öyle mi bu makalede (veya bu onun eski sürüm )?
Joachim Sauer

@JoachimSauer Teşekkürler, aynı zamanda ilginç bir makale, ama aradığım değil. Bu, dünya devleti paradigmasına odaklandı.
Petr Pudlák

Başımın üstünde Off, yorum burada iyi bir başlangıç
Adam

1
Bu bağlamda "dünya" ne anlama geliyor? Sanırım "Dünya" demek değil. Bir tür küresel kapsam mı? Bunu kaleme alan yazar kendini kısa satıyor. Eğer aynı anda okuyucularının egolarını karıştırmak ve ezmek istiyorsa, ona "Devlet Evrendir" veya "Tanrı Devleti" demeli. Dünya. Pah! Siz gençler bu günlerde yeterince yüksek istekli değilsiniz!
GlenPeterson

Yanıtlar:


33

Sorun IO a = worldState -> (a, worldState)şu ki, eğer bu doğru olsaydı, bunu ispatlayabilirdik forever (putStrLn "Hello") :: IO ave undefined :: IO aeşit olabilirdik. İşte dolio kanıtı (2010, irc):

forever m
 =
m >> forever m
 =
fix (\r -> m >> r)
 = {definition of >> for worldState -> (a, worldState)}
fix (\r -> \w -> r (snd $ m w))

Lemma: (\r w -> r (snd $ m w)) ⊥ = ⊥

(\r w -> r (snd $ m w)) ⊥
  =
\w -> ⊥ (snd $ m w))
  =
⊥ . snd . m
  =
⊥

bu nedenle forever m = fix (\r -> \w -> r (snd $ m w)) = ⊥

Özellikle forever (putStrLn "Hello") = ⊥dolayısıyla ve forever (putStrLn "Hello")ve undefineddengi programlardır. Ancak, açıkça teorik ya da pratikte eşdeğer programlar olarak kabul edilmemeleri gerekiyor.

Aynı anda eşzamanlılık yapılmadan bile bu modelin yanlış olduğuna dikkat edin.


7
Belirsiz bir programın undefinedHaskell'in saf anlambilimiyle eşdeğer olduğuna şaşırmış mı ? Haskell'in saf anlambiliminde farklı ind lerin ayırt edilemez olması gerekiyordu! Ancak, programlarımız hakkında operasyonel olarak düşündüğümüzde , IOdahil olmadığı durumlarda bile, farklı of türlerini ayırt etmek istiyoruz ; Ben benim program bir istisna atma ya o da ⊥ hem olduklarını kanıtlayarak eşit olduğunu kanıtlamak bile, sonsuz bir döngüye giriyor umrumda. Bu aslında bir çelişki değil.
Ben

3
⊥ ve [0,1 ..] ifadeleri her ikisi de "sonlandırılmayan" olsalar bile belirgindir. Aradaki fark, term'ın sonlandırılmayan ve üretken olmayan hesaplamaları ifade ederken, [0,1 ..] sonlandırılmayan ancak üretken olduğu anlamına gelir. Sonu gelmeyecek (putStrLn "Hello") benzer bir sonlandırıcı olmayan ancak üretken bir kimliğe sahip olmasını bekliyoruz.
Russell O'Connor,

1
Ama kesinlikle forever (putStrLn "Hello")gibi değil [0,1..]. Kanıtın özel değil worldState, bu yüzden normal devlet monadına da uygulandı. Bu yüzden forever (someModificationWith "Hello")aynı zamanda, o ile eşdeğerdir. Bu sonuçtan tamamen şaşırdım; o değil denotasyonel semantikte üretken ve hangi bilgisayarı yapıyor operasyonel sonsuza beklerken önemsizdir. Aynı şey için forever (putStrLn "Hello"); öyle değil ve olmamalı biz bir şekilde tembel tüketebileceği yeni bir dünya devleti üretirler.
Ben

IO için bildirimsel bir model sağlamak için açık dünya-devlet geçişini kullanan Mercury ve Clean gibi programlama dilleri temelde yanlış mıdır?
Ben

@ Dünyanın geçişi eşzamanlılıkla nasıl çalışmaktadır? Merkür'ün eşzamanlılığının rosetta kodunu gördünüz mü? Bunun anlamsal olarak ne anlama geldiğini merak ettim.
CMCDragonkai

12

İşte önemsiz bir cevap: devlet monadının devletinde yapılacak herhangi bir değişiklik, monadda yapılan herhangi bir eylemden kaynaklanıyor. Eğer gerçekten “WorldState -> (a, WorldState)” açıklaması aynı özelliği iddia ederse, WorldState yalnızca IO monad'ın değiştirdiği saf bir değere sahipse, yanlış olur. Zaman değişir, dosyaların içeriği, tutamaçların durumu vb. GÇ monadında olanlardan bağımsız olarak değişebilir. Bu, IO monadının amacı. GHC'nin altında RealWorld değerinin (veya a / a'nın) altından geçtiği gerçeği, bildiğim kadarıyla (sadece ST değerine koymak için bir şey olabilir) işlerin sırayla yapıldığını garanti etmektir.


8
bu aslında bir sorun değil. ciltleme işlemini, sabit ama bilinmeyen bir kural deposundan türetilen dünya durumunda bir değişiklik olarak modelleyebilirsiniz.
sclv

1
@sclv: evet, ancak bu sabit ama bilinmeyen kural deposu, IO’yu devlet monad'ı değil , bu tutarsızlık devlet monadında bulunmayan farklılaştırıcı faktördür
Jimmy Hoffa

WorldState durumuna karşı duyduğum bir argüman eşzamanlılıkla ilgilidir, ancak tam argümanı hatırlayamıyorum. Ancak yine de, WorldState'in geleceği de içine kodlayabildiğini varsayıyorum, bu yüzden sorunu gerçekten göremiyorum. Tabii ki, sanırım bir şeyleri özlüyorum.
Thomas Eding,

@JimmyHoffa: Eyaletteki kural deposunda dolaşabilirsiniz.
sclv

1
@JimmyHoffa: bu soyutlamanın amacıdır. Ayrıca, ilk yorumumu takip etmek için, temiz ve dünyayı geçerken IO modellerini, dünyayı aldatmadığınızdan ve "çoğaltmadığınızdan" emin olmak için benzersiz türleri kullanarak açıkça ve mutlu bir şekilde geçiyorlar. Bu soyutlamanın uygulanmasının bir yoludur.
sclv

12

Dilin çalışma zamanı sistemiyle iletişim kuran bir asimetrik coroutin biçimi olarak IO'nun nasıl modelleneceği konusunda bir blog yazısı yazdım. (Kuşkusuz bir serinin üçüncü kısmıdır)

http://comonad.com/reader/2011/free-monads-for-less-3/

Bu yazı, 'dünya-geçişi' anlambilimi hakkında aklın neden garip geldiğinin bir kısmını kapsıyor.


+1 - Özellikle ilginç, tasarladığım dilin IO'sunu buna benzer bir şekilde uygulamayı planladım! :)
Jules

8

Garip Kadrolarla Mücadele bölümüne bakın .

Bunun en büyük nedeni, IO monadının RealWorld eyalet modellerinin eşzamanlılıkla iyi çalışmadığıdır. Bu okunabilir klasikteki SPJ, onu anlamak için işlevsel bir anlambilim kullanmayı tercih eder.


Bu, aradığım özgün makale olduğuna inanıyorum, özellikle bölüm 3.1. Soruyu düzenlemeden önce göndermiş olsaydınız cevabınızı kabul ederdim, ancak şimdi diğerlerinin göndereceği tüm fikirleri görmek için sonuna kadar beklemenin daha adil olacağını düşünüyorum.
Petr Pudlák

5

RealWorld eyalet modelleri ile ilgili temel şikayet, TacTics’in dediği gibi dünya geçişinin mutlaka eşzamanlılıkla çalışmadığıdır. Ama Wouter Swierstra ve Thorsten Altenkirch gösterdi nasıl onların kağıt konuları serpiştirilmesi bir keyfi sabit fakat dizisi ile, etkisi "dünya geçirerek" olarak eşzamanlılık hakkında nedenden "Beast Güzeli: İşlevsel Bir Sematics Awkward Squad için": http : //www.staff.science.uu.nl/~swier004/Publications/BeautyInTheBeast.pdf

Buna karşılık gelen kod, IOSpec olarak Hackage'da bulunuyor: http://hackage.haskell.org/package/IOSpec

Bence Wouter'in tezi daha fazla ayrıntıya giriyor: http://www.staff.science.uu.nl/~swier004/Publications/Thesis.pdf

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.