> module ParseMonad where > import Control.Monad( ap ) > import Control.Applicative( Applicative(..) ) > import qualified Control.Monad.Fail as Fail > data ParseResult a = OkP a | FailP String > newtype P a = P (String -> Int -> ParseResult a) > runP :: P a -> String -> Int -> ParseResult a > runP :: forall a. P a -> String -> Int -> ParseResult a runP (P String -> Int -> ParseResult a f) = String -> Int -> ParseResult a f > lineP :: P Int > lineP :: P Int lineP = forall a. (String -> Int -> ParseResult a) -> P a P forall a b. (a -> b) -> a -> b $ \String _ Int l -> forall a. a -> ParseResult a OkP Int l > instance Monad P where > return :: forall a. a -> P a return a m = forall a. (String -> Int -> ParseResult a) -> P a P forall a b. (a -> b) -> a -> b $ \ String _ Int _ -> forall a. a -> ParseResult a OkP a m > P a m >>= :: forall a b. P a -> (a -> P b) -> P b >>= a -> P b k = forall a. (String -> Int -> ParseResult a) -> P a P forall a b. (a -> b) -> a -> b $ \String s Int l -> case forall a. P a -> String -> Int -> ParseResult a runP P a m String s Int l of > OkP a a -> forall a. P a -> String -> Int -> ParseResult a runP (a -> P b k a a) String s Int l > FailP String err -> forall a. String -> ParseResult a FailP String err > instance Fail.MonadFail P where > fail :: forall a. String -> P a fail String s = forall a. (String -> Int -> ParseResult a) -> P a P forall a b. (a -> b) -> a -> b $ \ String _ Int _ -> forall a. String -> ParseResult a FailP String s > instance Functor P where > fmap :: forall a b. (a -> b) -> P a -> P b fmap a -> b f P a a = P a a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= (forall (m :: * -> *) a. Monad m => a -> m a return forall b c a. (b -> c) -> (a -> b) -> a -> c . a -> b f) > instance Applicative P where > <*> :: forall a b. P (a -> b) -> P a -> P b (<*>) = forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b ap > pure :: forall a. a -> P a pure = forall (m :: * -> *) a. Monad m => a -> m a return