私は最近、状態モナドを見てきました。なぜなら、私はhaskellにパーサーコンビネータライブラリを構築したいからです。ハスケル - MonadState
私はMonadStateとして知られるtypeclassに出くわしました、私はこのtypeclassのポイントは何ですか、あなたはそれをどこで使うのでしょうか?
私は最近、状態モナドを見てきました。なぜなら、私はhaskellにパーサーコンビネータライブラリを構築したいからです。ハスケル - MonadState
私はMonadStateとして知られるtypeclassに出くわしました、私はこのtypeclassのポイントは何ですか、あなたはそれをどこで使うのでしょうか?
MonadState
は、彼らはただ一つのタイプのためではありません動作するようget
とput
機能を抽象化しますが、あらゆるタイプのために、状態モナドとしての役割を果たすことができます。主にモナド変圧器を動作させることです。
あまり詳しく説明しませんが、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
...
MonadState
状態モナド(このようなものは十分抽象的でないかのように、右か?)を抄録します。具体的なタイプState
にMonad
インスタンスを指定する代わりに、適切な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)
'MonadState'は、'国家としてのモナドのための型クラスでは、 ':https://hackage.haskell.org/package/mtl-2.2.1/docs/Control-Monad-State-Class.html –
あなた自身でこの質問に答えるために行った研究はありますか?あなたはその文書を読んだことがありますか?あなたは 'MonadState'のためにgoogledしましたか? –