¡Tengo un juego! 2 para la aplicación Scala que necesita recuperar algunos datos en formato JSON desde un servicio externo.¿Se aplican los transformadores de mónada para obtener JSON de los servicios?
The Play! framework permite realizar solicitudes HTTP de forma asíncrona al envolver la respuesta en un Promise. Promise
es una mónada que ajusta un valor que estará disponible en el futuro.
Esto está bien, pero en mi caso lo que obtengo del servicio web es una cadena JSON. Tengo que analizarlo y el análisis puede fallar. Así que tengo que envolver todo lo que obtenga en un Option
. El resultado es que muchos de mis métodos están devolviendo Promise[Option[Whatever]]
. Es decir, un valor de tipo Whatever
que, tal vez, estará disponible más adelante.
Ahora cada vez que tengo que operar sobre tal valor necesito map
dos veces. Estaba pensando en el manejo de esta de la siguiente manera:
- creación de un nuevo tipo, responda
Hope[A]
, que envuelve unPromise[Option[A]]
- la definición de los métodos pertinentes como
map
(o quizás debería utilizarforeach
y heredar de alguna colección rasgo?) yflatten
- proporcionan un convertidor implícito entre
Promise[Option[A]]
yHope[A]
.
Es fácil de definir map
- la composición de dos funtores es de nuevo un funtor - y flatten
puede hacerse de forma explícita en este caso, o cuando la composición de una mónada con Option
.
Pero es mi entendimiento limitado de que no necesito reinventar esto: el transformador de mónada existe exactamente para este caso. O, bueno, entonces creo que nunca he usado un transformador de mónada, y este es el punto de la pregunta:
¿Se pueden utilizar los transformadores de mónada en esta situación? ¿Cómo podría utilizarlos realmente?
¡Gracias, parece que esto es exactamente lo que necesito! – Andrea
Lo he probado y todo funciona bien en mi aplicación. Solo hay una cosa extraña: si introduzco un tipo alias 'escriba Hope [A] = Promise [Option [A]]' para simplificar el tipo de devolución de mis funciones, obtengo un error en tiempo de compilación 'java.lang.IllegalArgumentException : transpose requiere que todas las colecciones tengan el mismo tamaño ". ¿Tienes alguna pista de por qué? – Andrea
@Andrea: si usa un parámetro de tipo explícito con 'optionT', el error debería desaparecer. Parece un error de compilación y, si tiene tiempo, valdría la pena consultar [el rastreador de problemas] (https://issues.scala-lang.org/secure/Dashboard.jspa) o hacer una pregunta de seguimiento aquí. –