2011-09-16 16 views
5

Haskell’de yeniyim.HasOn'da kendi monadıma IO nasıl eklenir?

newtype MyMonad a = MyMonad (State -> Either MyError (State, a)) 

Ben küçük dilin tercüman kullanmak: Ben hata işleme ile Devlet monad olan kendi monad yazdı. Şimdi dilime (okuma/yazma) bazı IO işlemleri eklemek istiyorum, fakat IO monadının benimki içine nasıl ekleneceğini bilmiyorum. ErrorT, StateT, IO'yu birleştirebileceğimi ve bu sonuca ulaşabileceğimi biliyorum ama onlar olmadan da yapmanın başka bir yolu var mı?

cevap

6

Sen StateT nasıl uygulandığını bakabilirsiniz:

newtype StateT s m a = StateT { runStateT :: s -> m (a,s) } 

IO ile devlet birleştirmek için sadece m yerine IO koymak ve istenen tipini almak: s -> IO (a,s).

Hatalarınız varsa, başarısız hesaplamalar durumunun etkilenip etkilenmediğine bağlı olarak bu, s -> IO (Either e (a, s)) veya s -> IO (Either e a, s) gibi bir şey haline gelir.

s -> Either e (IO (a, s)) bir monad saat makinenizi olmadan yapamazsınız.

Güncelleme

Size hatta zaman makinesine sahip bir monad yapamaz çıkıyor. data M e a = M { runM :: Either e (IO a) } Şimdi

aşağıdaki programı düşünün:: Açıkçası

unsafePerformIO :: IO a -> a 
unsafePerformIO io = fromLeft $ runM $ do 
    a <- M $ Right $ io 
    M $ Left a 

bu işlev imkansız ve

imkansız neden bize () yerine ilk s ait kullanarak bizim monad basitleştirmek izin göstermek için bu nedenle M için monad örneği de imkansızdır.

Hangi zaman makinesinin size verebileceği, IO'u tek bir davranıştır State gibi davranma yeteneğidir. Ancak, Either e (s -> (a, s))'un bir monad olmadığını anlamıştım.

+0

Zaman makinesi? Biraz bağlam sağlayabilir misiniz? Bazı "ceza amaçlı" şaka mı yoksa bazı ileri matematiksel/programlama bilimi mi? – Tarrasch

+1

Burada ceza yok, gerçek zamanlı bir makine hakkında konuşuyorum. Bunu aldıktan sonra, bu monad'ı uygulayabilirsiniz. – Rotsor

+1

@Rotsor: açıklamak isterim * neden * zaman makinesi gerekli? – ivanm

İlgili konular