- def runParser[A](p: Parser[A]): Either[String, A] = {
- type F[A] = Either[String, A]
- def left (errMsg: String): F[A] = Left(errMsg)
- def right(x : A ): F[A] = Right(x)
+ implicit def ParserMonadError[E] = new MonadError[Parser, E] {
+ def point[A](a: => A)
+ = implicitly[Applicative[({type λ[α] = Parser[E, α]})#λ]].point(a)
+
+ def bind[A, B](m: Parser[E, A])(f: A => Parser[E, B])
+ = implicitly[Monad[({type λ[α] = Parser[E, α]})#λ]].bind(m)(f)
+
+ def handleError[A](m: Parser[E, A])(f: E => Parser[E, A]) = new Parser[E, A] {
+ def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[A, F, E, R]): F[E, R] = {
+ def kf_(e: E) = f(e).runParser(kf, ks)
+ return m.runParser(kf_, ks)
+ }
+ }
+
+ def raiseError[A](e: E) = new Parser[E, A] {
+ def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[A, F, E, R]): F[E, R]
+ = kf(e)
+ }
+ }
+
+ def runParser[E, A](p: Parser[E, A]): Either[E, A] = {
+ def left (e: E): Either[E, A] = Left(e)
+ def right(x: A): Either[E, A] = Right(x)