
In the haskell-src package, add the following instances to ParseResult that make it more convenient to traverse and modify a syntax tree. http://hackage.haskell.org/trac/ghc/ticket/3290 Two weeks discussion period.
instance Functor ParseResult where fmap f (ParseOk x) = ParseOk $ f x fmap f (ParseFailed loc msg) = ParseFailed loc msg
instance Applicative ParseResult where pure = ParseOk ParseOk f <*> x = f <$> x ParseFailed loc msg <*> _ = ParseFailed loc msg
instance Monad ParseResult where return = ParseOk ParseOk x >>= f = f x ParseFailed loc msg >>= _ = ParseFailed loc msg
instance Monoid m => Monoid (ParseResult m) where mempty = ParseOk mempty ParseOk x `mappend` ParseOk y = ParseOk $ x `mappend` y ParseOk x `mappend` err = err err `mappend` _ = err -- left-biased