This module implements the standard ``State Transformer''
monad\index{state transformer
monad}~\cite{Wadler92,Wadler94,KingWadl93}. Some of the definitions
in this module are taken from the Glasgow distribution (\verb~ghc~)
library file
\begin{verbatim}
src/ghc-0.19/ghc/lib/glaExts/PreludeST.lhs
\end{verbatim}
and the files
\begin{quote}
\verb~demos/Cse/stateMonad.gs ~ and
\verb~ demos/Ccexamples/ccexamples.gs~
\end{quote}
that are part of the Gofer
distribution~\cite{Jones_Gofer2.28,Jones_Gofer2.20}, and are included
here by permission of the authors. For an elementary introduction to
the monadic style of programming, see~\cite{Partain93}.
\begin{haskell}{StateT}
> module StateT(
> ST,
> returnST, bindST, bindST_, thenST, thenST_,
> startingFrom, startingWith, maplST, maprST
> ) where
\end{haskell}
The type constructor \verb~ST~ represents a {\em state
transformer}\index{state transformer}. A state transformer represents
a computation that takes an initial state and returns a result paired
with a new value of the state. The type variable \verb~s~ is the type
of the state and the type variable \verb~a~ is the type of the result.
\begin{haskell}{ST}
> type ST s a = s -> (a, s)
\end{haskell}
\fixhaskellspacing\begin{haskell}{returnST}
> returnST :: a -> ST s a
> returnST x s = (x,s)
\end{haskell}
\fixhaskellspacing\begin{haskell}{bindST}
> bindST :: ST s a -> (a -> ST s b) -> ST s b
> bindST m k s = let (a, s') = m s in k a s'
\end{haskell}
\fixhaskellspacing\begin{haskell}{bindST_}
> bindST_ :: ST s a -> ST s b -> ST s b
> bindST_ m k s = let (_, s') = m s in k s'
\end{haskell}
\fixhaskellspacing\begin{haskell}{thenST}
> thenST :: ST s a -> (a -> ST s b) -> ST s b
> thenST m k s = case m s of
> (a, s') -> k a s'
\end{haskell}
\fixhaskellspacing\begin{haskell}{thenST_}
> thenST_ :: ST s a -> ST s b -> ST s b
> thenST_ m k s = case m s of
> (_, s') -> k s'
\end{haskell}
The function \verb~startingWith~ applies a state transformer
to an initial state and returns a pair containing the final result and
the final state, while the function \verb~startingFrom~ returns only
the final result, dropping the final state.
\begin{haskell}{startingWith}
> startingWith :: ST s a -> s -> (a, s)
> m `startingWith` s0 = m s0
\end{haskell}
\fixhaskellspacing\begin{haskell}{startingFrom}
> startingFrom :: ST s a -> s -> a
> m `startingFrom` s0 = fst (m s0)
\end{haskell}
The following two functions were found in the file
\verb~demos/Cse/stateMonad.gs~ that is part of the Gofer distribution.
They are like \verb~map~ but thread a state through the calculation.
Here, \verb~maplST~ threads the state from left to right and
\verb~maprST~ threads the state from right to left. Thus,
\verb~maplST~ is like the function \verb~mapAccuml~ in the
\verb~ListUtil~ module provided with the Chalmer's Haskell system
\verb~hbc~. The function \verb~maplST~ is also found in the Glasgow
library under the name \verb~mapST~. I use `thenST' in both
definitions because that is what Glasgow uses in the definition of
their function \verb~mapST~.
\begin{haskell}{maplST}
> maplST :: (a -> ST s b) -> [a] -> ST s [b]
> maplST k [] = returnST []
> maplST k (x:xs) = k x `thenST` \y ->
> maplST k xs `thenST` \ys ->
> returnST (y:ys)
\end{haskell}
\fixhaskellspacing\begin{haskell}{maprST}
> maprST :: (a -> ST s b) -> [a] -> ST s [b]
> maprST k [] = returnST []
> maprST k (x:xs) = maprST k xs `thenST` \ys ->
> k x `thenST` \y ->
> returnST (y:ys)
\end{haskell}
%%%%%%%%%% End of StateTransformer.lhs %%%%%%%%%%
|