У меня есть код, возвращающий Future[String \/ Response]
, экземпляры монады для обоих Disjunction
и Future
и функции getResult: Response => [String \/ Result]
. Теперь это написано с несколькими вложенными функциями, и я хочу увидеть его следующим образомMonad трансформатор для дизъюнкции и будущего
for {
response <- getResponse
result <- getResult(response)
} yield result // Future[String \/ Result]
Как я могу понять, монада трансформаторы используют именно для этой цели, и я мог бы сделать similar вещи, если бы я Option
вместо \/
. Но, к сожалению, я не смог найти FutureT
или DisjunctionT
(хотя для кошек существует XorT
).
Итак, можно ли написать монодальный трансформатор для цели? Может быть, он уже существует или я что-то не понимаю.
Эй Питер. Спасибо, что указал мне на скалаз, но я пропустил его. К сожалению, оба примера не работали: сначала один, потому что 'getResult' не возвращает Future, второй потому, что обе функции не соответствуют типу R [_]. В любом случае, это работает: 'EitherT (getResponse) .map (getResult) .run' и немного лучше, чем моя предыдущая реализация. Также мне все еще интересно, что делать, когда у вас нет трансформатора. – chuwy
UPD: нет, я ошибаюсь. Моя карта приводит к вложенной дизъюнкции. Я, вероятно, мог бы «присоединиться», но это выглядит совсем не изящно. – chuwy
'map' действительно является функцией от' EitherT [F, A, B] 'до' EitherT [F, A, C] ', поэтому вы получаете' EitherT [F, String, String \/Result] '. Решением может быть использование 'flatMapF':' EitherT (getInt) .flatMapF (getRes (_). Point [Future]). Run'. –