2011-09-16 19 views
5

私はハスケルを初めて利用しています。ハスケルで自分のモナドにIOを追加するには?

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

私は小さな言語の通訳でそれを使用します。私は、エラー処理とStateモナドである私自身のモナドを書きました。今では私の言語にいくつかのIO操作を追加したい(読み書きする)が、IOモナドを私の中に囲む方法はわかりません。私はErrorT、StateT、IOを結合してこの結果を得ることができることを知っていますが、それがなければそれを行う別の方法はありますか?

答えて

6

あなたは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))がモナドではないことに気付かなかった。

+0

タイムマシン?文脈を提供することはできますか?それはいくつかの "いたずら意図"の冗談、またはいくつかの高度な数学的/プログラミング科学用語ですか? – Tarrasch

+1

ここで言葉遣いはありません、私はリアルタイムマシンについて話しています。いったんそれができたら、このモナドを実装することができます。 – Rotsor

+1

@Rotsor:説明するための配慮*なぜ*タイムマシンが必要か? – ivanm

関連する問題