Writing a State Monad
In this recipe, we will write our own State Monad. We will use the state
monad to store the effect of cursor movements.
How to do it...
- Create a new project
state-monad
using thestack
command with thesimple
template:
stack new state-monad simple
- Open the file
src/Main.hs
; we will add our code here after the initialmodule
declaration. - Import the following modules:
import Prelude hiding (Either(..)) import Data.Functor import Control.Applicative import Control.Monad
- Now, add the definition for the State Monad. A State Monad will store state
s
with the monad:
data State s a = State { runState :: s -> (a, s) }
- Now, we will write the
Functor
instance for the state. Writing theFunctor
instance is easy; we need to transform outputa
with the functionf :: a -> b
and produceb
:
instance Functor (State s) where fmap f (State stateFunc) = let nextStateFunction s = let (xa, s1) = stateFunc s ...