Skip to content

Instantly share code, notes, and snippets.

@emlautarom1
Created July 13, 2020 01:23
Show Gist options
  • Save emlautarom1/2cf3a1f17d70594bbba24aacecb0b89e to your computer and use it in GitHub Desktop.
Save emlautarom1/2cf3a1f17d70594bbba24aacecb0b89e to your computer and use it in GitHub Desktop.
State Monad
newtype State s a = State { runState :: s -> (s, a) }
instance Functor (State s) where
-- fmap :: (a -> b) -> State s a -> State s b
fmap g (State f) = State (\s ->
let (s', a) = f s
in (s', g a))
instance Applicative (State s) where
-- pure :: a -> (State s a)
pure v = State (\s -> (s, v))
-- State s (a -> b) -> State s a -> State s b
(State sF) <*> (State sV) = State (\s ->
let (s', f) = sF s
(s'', v) = sV s'
in (s'', f v))
instance Monad (State s) where
return = pure
-- (>>=) :: State s a -> (a -> State s b) -> State s b
(>>=) (State sA) f = State (\s ->
let (s', a) = sA s
in runState (f a) s')
get :: State s s
get = State (\s -> (s, s))
put :: s -> State s ()
put s = State (\_ -> (s, ()))
modify :: (s -> s) -> State s ()
modify f = get >>= put . f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment