Рассмотрим следующий фрагмент:
def foo(x:String): EitherT[F, Throwable, String] = ???
def bar(x:String): EitherT[F, Throwable, String] = ???
Я хочу следующее:
На некотором входе s
сначала вызовите foo(s)
и, если он "потерпит неудачу", верните вывод bar(s)
иначе возвращает вывод foo(s)
без вызова bar(s)
. Я придумал следующее.
def foobar(s:String) = {
val f = foo(s)
// if f is successful return f else return bar(s)
f.biflatMap(_ => bar(s), _ => f)
}
Есть ли лучший способ сделать то, что я хочу?