Есть ли более идиоматический способ получить IO [Option [A]] из Option [IO [Option [A]], чем использовать соединение последовательности и сопоставления? - PullRequest
6 голосов
/ 12 января 2012

Я сталкиваюсь с довольно большим количеством мест, где у меня есть что-то похожее на

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)

Видеть повторение снова и снова .sequence.map(_.join) начинает беспокоить меня. Есть ли более идиоматический способ сделать то же самое?

Ответы [ 2 ]

1 голос
/ 12 апреля 2012

Идиоматический метод работы с цепями Option заключается в использовании for-compitions и вызова getOrElse.

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

Нельзя обойтись ни с установкой по умолчанию, ни с повышением исключения, если вы собираетесь категорически распаковать Option, поскольку f может вернуть None, а g не может принять это.

1 голос
/ 13 января 2012

Это похоже на сценарий использования монадных преобразователей, см. здесь для объяснения в Haskell и здесь для обсуждения в Scala.

...