У меня есть игра! 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.
Но мое ограниченное понимание, что мне не нужно изобретать этот материал: трансформатор монады существует именно для этого случая. Или, ну, так я думаю - я никогда не использовал монад-трансформер - и в этом суть вопроса:
Могут ли трансиверы монады использоваться в этой ситуации? Как я могу их фактически использовать?