是否有更惯用的方法从Option [IO [Option [A]]获取IO [Option [A]]然后使用序列和映射连接?

时间:2012-01-11 23:54:14

标签: scala scalaz

我遇到了很多类似于

的地方
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 个答案:

答案 0 :(得分:1)

这听起来像monad变换器的用例,请参阅here以获取Haskell中的解释,并here查看Scala中的讨论。

答案 1 :(得分:1)

处理Option链的惯用方法是使用for-comprehensions和getOrElse调用。

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

由于Option可以返回f并且None无法解决g,因此无法解决违约问题或提出异常问题接受。