有没有更惯用的方法从 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]] 然后使用序列和映射连接?的主要内容,如果未能解决你的问题,请参考以下文章

处理 Option 和 Either 类型 - 惯用转换?

有没有更惯用的方法来拆分 std::vector?

在 Python 中填充字典的更惯用的方法

如何在 Rust 中惯用地将 bool 转换为 Option 或 Result?

如何在 Rust 中以最惯用的方式将 Option<&T> 转换为 Option<T>?

如何从 List[Option] 中过滤掉 None?