B => EitherT[F, AA, D])(implicit F: Monad[F]): EitherT[F, AA, D] = EitherT(F.flatMap(value) { case l @ Left(_) => F.pure(EitherUtil.rightCast(l)) case Right(b) => f(b).value }) // F を Future に固定するなら def flatMap[AA >: A, D](f: B => EitherT[Future, AA, D]): EitherT[Future, AA, D] = EitherT(value.flatMap { case l @ Left(_) => Future.successful(EitherUtil.rightCast(l)) case Right(b) => f(b).value }) Future#flatMap 内で例外が投げられたら catch されて Failure になる ≒ 異常系で処理が短絡