Вот пример кода:
type FailFast[A] = Either[List[String], A]
import cats.instances.either._
def f1:ReaderT[FailFast, Map[String,String], Boolean] = ReaderT(_ => Right(true))
def f2:ReaderT[FailFast, Map[String,String], Boolean] = ReaderT(_ => Right(true))
def fc:ReaderT[FailFast, Map[String,String], Boolean] =
for {
b1 <- f1
if (b1)
b2 <- f2
} yield b2
Ошибка:
Ошибка: (17, 13) значение withFilter не является членом cats.data.ReaderT [TestQ.this.FailFast, Map [String, String], Boolean] b1 ‹- f1
Как я могу составить f1 с f2. f2 должен применяться только в том случае, если f1 возвращает Right (true). Я решил это с помощью:
def fc2:ReaderT[FailFast, Map[String,String], Boolean] =
f1.flatMap( b1 => {
if (b1)
f2
else ReaderT(_ => Right(true))
})
Но я надеюсь, что есть более элегантное решение.
match/case
в потоке Scala либо map Right, либо return Left (даже хотя вопрос в другом) есть подробности о том, как это можно было сделать - person   schedule 27.03.2019