The power of projections

Предположим, что у вас есть интерфейсов с сигнатурами вида

trait DaoPersistence {

  def doA(...): Option[A]

  def doB(a: A): Option[B]

}

и есть например желание сделать из них, как в хаскеле, ду-нотацию с матюками

поскольку матюки могут в целом быть разные, то можно применять вот такой вот многословный трюк

(for (
  myA <- doA(...).toEither("A not defined").right;
  myB <- doB(myA).toEither("B is not defined). right
) yield myB ) match {
  case Left(msg)  doSomeError(msg)
  case Right(b)  doComplete(b)
}

и почти хаскель, и никакого ScalaZ.