- Create a new project state-monad using the stack command with the simple template:
stack new state-monad simple
- Open the file src/Main.hs; we will add our code here after the initial module 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 the Functor instance is easy; we need to transform output a with the function f :: a -> b and produce b:
instance Functor (State s) where fmap f (State stateFunc) = let nextStateFunction ...