8

我遇到了很多类似的地方

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)一遍又一遍的重复开始困扰我。有没有更惯用的方式来完成同样的事情?

4

2 回答 2

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不能接受,那么无论是默认还是引发异常都无法解决。

于 2012-04-12T06:26:53.120 回答
1

这听起来像是 monad 转换器的用例,请参阅此处了解 Haskell 中的解释和此处了解 Scala 中的讨论。

于 2012-01-13T12:16:12.833 回答