あなたはStateTがどのように実装されるかを見ることができます:
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }
あなただけのm
の代わりにIO
を入れて、希望のタイプを取得IO
で状態を結合するには:s -> IO (a,s)
を。
エラーがある場合は、失敗した計算が状態に影響を与えるかどうかによって、s -> IO (Either e (a, s))
またはs -> IO (Either e a, s)
のようになります。
s -> Either e (IO (a, s))
には、タイムマシンなしで
のモナド
を使用できないことに注意してください。
更新
それはあなたがそれも、タイムマシンとモナドことはできませんが判明しました。今data M e a = M { runM :: Either e (IO a) }
、次のプログラムを想像:明らかに、この関数は不可能です
unsafePerformIO :: IO a -> a
unsafePerformIO io = fromLeft $ runM $ do
a <- M $ Right $ io
M $ Left a
をし、それが不可能である理由を、示して私たちは()
代わりのs
最初を使用することにより、当社のモナドを簡素化できるように
したがって、M
のモナドインスタンスも不可能です。
IO
のように正確に扱うことができるマシンは、State
です。しかし、私はEither e (s -> (a, s))
がモナドではないことに気付かなかった。
タイムマシン?文脈を提供することはできますか?それはいくつかの "いたずら意図"の冗談、またはいくつかの高度な数学的/プログラミング科学用語ですか? – Tarrasch
ここで言葉遣いはありません、私はリアルタイムマシンについて話しています。いったんそれができたら、このモナドを実装することができます。 – Rotsor
@Rotsor:説明するための配慮*なぜ*タイムマシンが必要か? – ivanm