эта тема дали мне представление о том, как структурировать код: Scala-way to handle conditions in for-comprehensions?Scala - Фьючерсы и Eithers
детали в вопросе:
// First create the JSON
val resultFuture: Future[Either[Failure, JsResult]] = for {
userRes <- userDao.findUser(userId)
user <- userRes.withFailure(UserNotFound).right
authRes <- userDao.authenticate(user)
auth <- authRes.withFailure(NotAuthenticated).right
goodRes <- goodDao.findGood(goodId)
good <- goodRes.withFailure(GoodNotFound).right
checkedGood <- checkGood(user, good).right
} yield renderJson(Map("success" -> true)))
Это те строки, я не понимаю:
user <- userRes.withFailure(UserNotFound).right
authRes <- userDao.authenticate(user)
userRes.withFailure (UserNotFound) .right сопоставлен с userDao.authenticate (пользователь). Это приведет к созданию нового Либо с Будущим справа, правильно?
Как
val resultFuture: Future[Either[Failure, JsResult]]
может быть его типа. Я думаю, вместо JsResult должно быть другое будущее. Может ли кто-нибудь объяснить это мне?
EDIT: С cmbaxter и Arne Claassen подтвердил это, новый вопрос: Как я должен написать этот код, так что это не выглядит некрасиво, но чистый и структурированный?
Я согласен, что с этим ответом что-то не так. Как много раз было опубликовано на SO, вы не можете смешивать типы для понимания. Какой бы тип, с которого вы начинаете, - это тип, который вам нужно распространять с помощью остальных шагов ('flatMap's). В этом случае, поскольку 'findUser' возвращает' Future [Option [User]], '' 'Future' становится типом, который вы должны продолжать использовать в остальных шагах. Вы не можете просто переключиться на «Либо», как этот человек делает на втором этапе понимания. – cmbaxter
Немного смутил себя. Обычно для понимания работает один тип Монады за раз, и здесь мы смешиваем функции, которые производят «Будущие» и «Либо». Я не смог получить исходный пример для разбора –