У меня есть игра! 2 для приложения Scala, которому необходимо получить некоторые данные в формате JSON из внешней службы.
Игра! framework позволяет асинхронно делать HTTP-запросы, обертывая ответ в Promise. Promise
- это монада, которая обертывает значение, которое будет доступно в будущем.
Это хорошо, но в моем случае то, что я получаю от веб-службы, это строка JSON. Мне нужно разобрать его, и синтаксический анализ может завершиться неудачей. Поэтому я должен обернуть все, что попадаю в Option
. В результате многие мои методы возвращают Promise[Option[Whatever]]
. То есть значение типа Whatever
, которое, возможно, будет доступно позже.
Теперь, когда мне приходится работать над таким значением, мне нужно map
его дважды. Я думал об этом, следующим образом:
- создаем новый тип, скажем
Hope[A]
, который обертываетPromise[Option[A]]
- определение соответствующих методов, таких как
map
(или, может быть, я должен использоватьforeach
и наследовать от некоторого символа коллекции?) иflatten
- предоставлять неявный конвертер между
Promise[Option[A]]
иHope[A]
.
Легко определить map
- композиция двух функторов снова является функтором - и flatten
может быть сделано явно в этом случае или при составлении монады с Option
.
Но мое ограниченное понимание, что мне не нужно изобретать этот материал: трансформатор монады существует именно для этого случая. Или, ну, так я думаю - я никогда не использовал монад-трансформер - и в этом суть вопроса:
Могут ли трансиверы монады использоваться в этой ситуации? Как я могу их фактически использовать?