Цель состоит в том, чтобы лениво оценить набор функций, останавливающихся и возвращающих первый счастливый результат.Вычисления должны быть последовательными.Вот моя попытка
def f1(i: Int): Either[String, Int] = {println(s"f1($i)"); Left("boom-f1") }
def f2(i: Int): Either[String, Int] = {println(s"f2($i)"); Left("boom-f2") }
def f3(i: Int): Either[String, Int] = {println(s"f3($i)"); Right(i) }
val in = 42
(f1(in) #:: f2(in) #:: f3(in) #:: Stream.empty) collectFirst { case Right(x) => x } toRight("boom")
, которая выдает
f1(42)
f2(42)
f3(42)
res0: Either[String,Int] = Right(42)
, где мы видим все три выполненных, тогда как
def f1(i: Int): Either[String, Int] = {println(s"f1($i)"); Right(i) }
def f2(i: Int): Either[String, Int] = {println(s"f2($i)"); Right(i) }
def f3(i: Int): Either[String, Int] = {println(s"f3($i)"); Right(i) }
выдаст
f1(42)
res0: Either[String,Int] = Right(42)
где мы видим только одного казненного.
Предоставляют ли кошки абстракцию для такого ленивого обхода, связанного с неудачами?