Допустим, у вас есть EitherT, который выглядит примерно так:
type StateListOfString[+T] = State[List[String], T]
type MyEitherT = EitherT[StateListOfString, Int, Boolean]
Если у вас есть понимание, которое может вернуть left:
my computation = for {
a <- thingThatCouldReturnLeft
b <- otherThingThatCouldReturnLeft
} yield b
Как вы можете следовать за пониманием, которое манипулирует состоянием, прежде чем оно вернет левое?
Думаю, мне нужно что-то очень близкое к orElse, но orElse не имеет доступа к значению left:
def orElse[AA >: A, BB >: B](x: => EitherT[F, AA, BB])(implicit F: Bind[F]): EitherT[F, AA, BB] = {
Если бы он взял что-то вроде (x: => Int => EitherT [F, AA, BB]) вместо просто (x: => EitherT [F, AA, BB]), это сработало бы.
Я пробовал начать с:
for {
a <- myComputation.isLeft
// OK, now I have something sensible, and I can follow up with something like
// a leftMap
Но если я начну с вызова isLeft, похоже, что вычисление выполняется как минимум дважды: один раз для isLeft и еще раз, когда я вызываю что-то вроде leftMap.
Что здесь нужно использовать?