type Record = Map[Symbol, Field]
// ---
- type Failure[ F[_], R] = String => F[R]
- type Success[A, F[_], R] = A => F[R]
+ type Failure[ F[_, _], E, R] = E => F[E, R]
+ type Success[A, F[_, _], E, R] = A => F[E, R]
- trait Parser[A] {
- def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R]
+ trait Parser[E, A] {
+ def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[A, F, E, R]): F[E, R]
}
- implicit def ParserFunctor = new Functor[Parser] {
- def map[A, B](m: Parser[A])(f: A => B) = new Parser[B] {
- def runParser[F[_], R](kf: Failure[F, R], ks: Success[B, F, R]): F[R] = {
+ implicit def ParserFunctor[E] = new Functor[({type λ[α] = Parser[E, α]})#λ] {
+ def map[A, B](m: Parser[E, A])(f: A => B) = new Parser[E, B] {
+ def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[B, F, E, R]): F[E, R] = {
def ks_(a: A) = ks(f(a))
return m.runParser(kf, ks_)
}
}
}
- implicit def ParserApplicative = new Applicative[Parser] {
- def point[A](a: => A) = new Parser[A] {
- def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R] = ks(a)
+ implicit def ParserApplicative[E] = new Applicative[({type λ[α] = Parser[E, α]})#λ] {
+ def point[A](a: => A) = new Parser[E, A] {
+ def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[A, F, E, R]): F[E, R]
+ = ks(a)
}
-
- def ap[A, B](m: => Parser[A])(fm: => Parser[A => B]) = new Parser[B] {
- def runParser[F[_], R](kf: Failure[F, R], ks: Success[B, F, R]): F[R] = {
- def ks_(f: A => B): F[R] = {
+ def ap[A, B](m: => Parser[E, A])(fm: => Parser[E, A => B]) = new Parser[E, B] {
+ def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[B, F, E, R]): F[E, R] = {
+ def ks_(f: A => B): F[E, R] = {
def ks__(a: A) = ks(f(a))
return m.runParser(kf, ks__)
}
}
}
- implicit def ParserMonad = new Monad[Parser] {
- def point[A](a: => A) = implicitly[Applicative[Parser]].point(a)
+ implicit def ParserMonad[E] = new Monad[({type λ[α] = Parser[E, α]})#λ] {
+ def point[A](a: => A)
+ = implicitly[Applicative[({type λ[α] = Parser[E, α]})#λ]].point(a)
- def bind[A, B](m: Parser[A])(f: A => Parser[B]) = new Parser[B] {
- def runParser[F[_], R](kf: Failure[F, R], ks: Success[B, F, R]): F[R] = {
+ def bind[A, B](m: Parser[E, A])(f: A => Parser[E, B]) = new Parser[E, B] {
+ def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[B, F, E, R]): F[E, R] = {
def ks_(a: A) = f(a).runParser(kf, ks)
return m.runParser(kf, ks_)
}
}
}
- 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)
return p.runParser(left, right)
}
// ---