-- BNF Converter: Error Monad -- Copyright (C) 2004 Author: Aarne Ranta -- This file comes with NO WARRANTY and may be used FOR ANY PURPOSE. module Language.Clafer.Front.ErrM where import Language.Clafer.Front.Absclafer -- the Error monad: like Maybe type with error msgs import Control.Monad (MonadPlus(..), liftM) data Err a = Ok a | Bad Pos String deriving (Show, Eq, Ord) instance Monad Err where return = Ok fail = Bad noPos Ok a >>= f = f a Bad p s >>= _ = Bad p s instance Functor Err where fmap = liftM instance MonadPlus Err where mzero = Bad noPos "Err.mzero" mplus (Bad _ _) y = y mplus x _ = x