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.
Zaman makinesi? Biraz bağlam sağlayabilir misiniz? Bazı "ceza amaçlı" şaka mı yoksa bazı ileri matematiksel/programlama bilimi mi? – Tarrasch
Burada ceza yok, gerçek zamanlı bir makine hakkında konuşuyorum. Bunu aldıktan sonra, bu monad'ı uygulayabilirsiniz. – Rotsor
@Rotsor: açıklamak isterim * neden * zaman makinesi gerekli? – ivanm