2012-01-11 12 views
6

estoy corriendo en unos pocos lugares en los que tengo bastantes algo parecido a¿Existe una forma más idiomática de obtener IO [Opción [A]] de la Opción [IO [Opción [A]] y luego usar secuencia y asignación de correspondencia?

def f(s: String): Option[Long] = ... 
def g(l: Long): IO[Option[Wibble]] = ... 

val a: IO[Option[Wibble]] = f(param).flatMap(g).sequence.map(_.join) 

Al ver la .sequence.map(_.join) repiten una y otra está empezando a molestarme. ¿Hay una forma más idiomática de lograr lo mismo?

+1

¿Estás seguro de los tipos en el ejemplo? El tipo de g no parece compatible con flatMap allí para mí. –

+0

Si le entiendo correctamente, quiere hacer exactamente eso: http://stackoverflow.com/questions/5968345/un-optioning-an-optioned-option –

Respuesta

1

Esto suena como el caso de uso para los transformadores de mónada, vea here para una explicación en Haskell y here para una discusión en Scala.

1

El método idiomático para tratar con las cadenas Option es usar for-comprehensions y una llamada getOrElse.

val a = for { 
    val temp <- f(param) 
    val result <- Some(g(temp)) 
} yield result getOrElse <Default Here> 

No hay manera de evitarlo, ya sea que tenga un defecto o lanzar una excepción si se va a descomprimir categóricamente la Option desde f puede volver None y g no puede aceptar eso.

Cuestiones relacionadas