LINUX.ORG.RU

История изменений

Исправление 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)))

Пока не понял, нравится мне, или нет.