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

rwa*_*ace 7 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)
Run Code Online (Sandbox Code Playgroud)

看到.sequence.map(_.join)重复一遍又一遍,开始困扰我.有没有更惯用的方式来完成同样的事情?

Ozy*_*ias 1

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