有没有更惯用的方法从 Option[IO[Option[A]] 获取 IO[Option[A]] 然后使用序列和映射连接?
Posted
技术标签:
【中文标题】有没有更惯用的方法从 Option[IO[Option[A]] 获取 IO[Option[A]] 然后使用序列和映射连接?【英文标题】:Is there a more idiomatic way of getting IO[Option[A]] from Option[IO[Option[A]] then using sequence and mapping join? 【发布时间】:2012-02-08 08:23:41 【问题描述】:我遇到了很多类似的地方
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)
一遍又一遍地重复,我开始感到困扰。有没有更惯用的方式来完成同样的事情?
【问题讨论】:
您确定示例中的类型吗? g 的类型在我看来与 flatMap 不兼容。 如果我理解正确的话,你想这样做:***.com/questions/5968345/… 【参考方案1】:这听起来像是 monad 转换器的用例,请参阅 here 以获得 Haskell 中的解释和 here 中的 Scala 讨论。
【讨论】:
【参考方案2】:处理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
不能接受。
【讨论】:
以上是关于有没有更惯用的方法从 Option[IO[Option[A]] 获取 IO[Option[A]] 然后使用序列和映射连接?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rust 中惯用地将 bool 转换为 Option 或 Result?