2016-08-24 8 views
-1

私は最近、状態モナドを見てきました。なぜなら、私はhaskellにパーサーコンビネータライブラリを構築したいからです。ハスケル - MonadState

私はMonadStateとして知られるtypeclassに出くわしました、私はこのtypeclassのポイントは何ですか、あなたはそれをどこで使うのでしょうか?

+0

'MonadState'は、'国家としてのモナドのための型クラスでは、 ':https://hackage.haskell.org/package/mtl-2.2.1/docs/Control-Monad-State-Class.html –

+0

あなた自身でこの質問に答えるために行った研究はありますか?あなたはその文書を読んだことがありますか?あなたは 'MonadState'のためにgoogledしましたか? –

答えて

2

MonadStateは、彼らはただ一つのタイプのためではありません動作するようgetput機能を抽象化しますが、あらゆるタイプのために、状態モナドとしての役割を果たすことができます。主にモナド変圧器を動作させることです。

あまり詳しく説明しませんが、StateTが存在することを知っていると仮定しましょう:1つのモナドを取り、状態として動作する新しいモナドを返します。 (ここでは、怠け者と厳密な状態の違いを無視します)。状態を処理モナドは次にIdentityモナドにStateTを適用することによって定義することができる。

newtype State s = StateT s Identity 

限り入力タイプがモナドであるように、我々はStateTによって返さモナドためMonadStateインスタンスを提供することができます

この

-- Add state to any monad 
instance Monad m => MonadState s (StateT s m) where 
    ... 
StateT へのモナドを適用すること(だけでなく、 Identity)は状態モナドとして扱うことができモナドを生成することを言います。

さらに、あなたは状態モナドを包むものがある限り、それはMonadStateを実装しても、状態モナドであると言うことができます:

-- Add Maybe to a state monad, it's still a state monad 
instance MonadState s m => MonadState s (MaybeT m) where 
    ... 

-- Add Writer to a state monad, it's still a state monad 
instance (Monoid w, MonadState s m) => MonadState s (WriterT w m) where 
    ... 
0

MonadState状態モナド(このようなものは十分抽象的でないかのように、右か?)を抄録します。具体的なタイプStateMonadインスタンスを指定する代わりに、適切なgetおよびputの機能を提供できる場合は、Monadのいずれかを使用できます。特に、StateTを使用すると、エフェクトを組み合わせることができます。国家とIOを組み合わせ

簡単な例:

tick :: (MonadIO m, MonadState Int m) => m() 
tick = do 
    x <- get 
    liftIO $ putStrLn ("incrementing " ++ (show x)) 
    put (x+1) 

> runStateT (tick >> tick >> tick >> tick) 5 
incrementing 5 
incrementing 6 
incrementing 7 
incrementing 8 
((),9)