标签: 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)
看到.sequence.map(_.join)一遍又一遍地重复,开始困扰我。有没有更惯用的方式来完成同样的事情?
.sequence.map(_.join)
答案 0 :(得分:1)
这听起来像monad变换器的用例,请参阅here以获取Haskell中的解释,并here查看Scala中的讨论。
答案 1 :(得分:1)
处理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