Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我遇到了很多类似的地方
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)一遍又一遍的重复开始困扰我。有没有更惯用的方式来完成同样的事情?
.sequence.map(_.join)
处理Option链的惯用方法是使用 for-comprehensions 和getOrElse调用。
Option
getOrElse
val a = for { val temp <- f(param) val result <- Some(g(temp)) } yield result getOrElse <Default Here>
如果您要断然解包Option因为f可以返回None并且g不能接受,那么无论是默认还是引发异常都无法解决。
f
None
g
这听起来像是 monad 转换器的用例,请参阅此处了解 Haskell 中的解释和此处了解 Scala 中的讨论。