【问题标题】:Is there a more idiomatic way of getting IO[Option[A]] from Option[IO[Option[A]] then using sequence and mapping join?有没有更惯用的方法从 Option[IO[Option[A]] 获取 IO[Option[A]] 然后使用序列和映射连接?
【发布时间】: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) 一遍又一遍地重复,我开始感到困扰。有没有更惯用的方式来完成同样的事情?

【问题讨论】:

标签: scala scalaz


【解决方案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 不能接受。

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2019-03-03
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多