История изменений
Исправление Bohtvaroh, (текущая версия) :
Со StateT получается что-то вроде:
import scalaz._
import Scalaz._
object Playground extends App {
type Stream = String
type Mined = List[String]
type ParserState = (Stream, Mined)
type MyEither[+T] = Either[Playground.ParserState, T]
val s1 = StateT[MyEither, ParserState, Unit] { s =>
Right((("input at s1", add(s, "header")), ()))
}
val s2 = StateT[MyEither, ParserState, Unit] { s =>
Right((("input at s2", add(s, "section1")), ()))
}
val s3 = StateT[MyEither, ParserState, Unit] { s =>
Left(s)
}
val s4 = StateT[MyEither, ParserState, Unit] { s =>
Right((("input at s4", add(s, "section3")), ()))
}
def add(s: ParserState, mined: String): Mined = mined :: s._2
val parser =
for {
_ <- s1
_ <- s2
_ <- s3
_ <- s4
} yield ()
println(parser.run(("input", List())))
}
Left((input at s2,List(section1, header)))
Пока не понял, нравится мне, или нет.
Исходная версия Bohtvaroh, :
Со StateT получается что-то вроде:
import scalaz._
import Scalaz._
object Playground extends App {
type Stream = String
type Mined = List[String]
type ParserState = (Stream, Mined)
val s1 = StateT[({type l[+A] = Either[ParserState, A]})#l, ParserState, Unit] { s =>
Right((("input at s1", add(s, "header")), ()))
}
val s2 = StateT[({type l[+A] = Either[ParserState, A]})#l, ParserState, Unit] { s =>
Right((("input at s2", add(s, "section1")), ()))
}
val s3 = StateT[({type l[+A] = Either[ParserState, A]})#l, ParserState, Unit] { s =>
Left(s)
}
val s4 = StateT[({type l[+A] = Either[ParserState, A]})#l, ParserState, Unit] { s =>
Right((("input at s4", add(s, "section3")), ()))
}
def add(s: ParserState, mined: String): Mined = mined :: s._2
val parser =
for {
_ <- s1
_ <- s2
_ <- s3
_ <- s4
} yield ()
println(parser.run(("input", List())))
}
Left((input at s2,List(section1, header)))
Пока не понял, нравится мне, или нет.