This module implements the {\em maybe state transformer}, which is the state transformer monad (Chapter~\ref{ch:StateT}) coupled with the ``Maybe'' monad, where the ``Maybe'' type is wrapped around the pair containing the result and the new state. This approach to combining the State Transformer monad with another monad was suggested in~\cite{KingWadl93}. The ``Maybe'' type is implemented in the \verb~hbc~ library module \verb~Maybe~. Like the state transformer, the maybe state transformer represents a calculation that takes an initial state and returns a result paired with a new value of the state; however, the maybe state transformer is used when it is possible for the calculation to fail. We mostly use this monad to structure functions that read data files. \begin{haskell}{MaybeStateT} > module MaybeStateT( #ifndef __GLASGOW_HASKELL__ > module Maybe, #endif > MST, > returnMST, bindMST, thenMST > ) where #ifndef __GLASGOW_HASKELL__ > import Maybe #endif \end{haskell} \fixhaskellspacing\begin{haskell}{MST} > type MST s a = s -> Maybe (a, s) \end{haskell} \fixhaskellspacing\begin{haskell}{returnMST} > returnMST :: a -> MST s a > returnMST x = \s -> Just (x, s) \end{haskell} \fixhaskellspacing\begin{haskell}{bindMST} > bindMST :: MST s a -> (a -> MST s b) -> MST s b > bindMST m k s = m s `thenM` \(x, s') -> k x s' > where > m `thenM` k = case m of > Nothing -> Nothing > Just a -> k a \end{haskell} \fixhaskellspacing\begin{haskell}{thenMST} > thenMST :: MST s a -> (a -> MST s b) -> MST s b > thenMST m k s = case m s of > Nothing -> Nothing > Just (x, s') -> k x s' \end{haskell}