析取模式匹配

Pattern Matching on Disjunction

鉴于以下情况:

scala> val err: \/[String, Boolean \/ Int] = -\/("bad")
err: scalaz.\/[String,scalaz.\/[Boolean,Int]] = -\/(bad)

我写了一个函数,它接受一个 \/[String, Boolean \/ Int] 和 returns 一个 Boolean \/ Int:

scala> def f(x: \/[String, Boolean \/ Int]): \/[Boolean, Int] = x match {
     |       case -\/(_) => -\/(false)
     |       case \/-(y) => y
     | }
f: (x: scalaz.\/[String,scalaz.\/[Boolean,Int]])scalaz.\/[Boolean,Int]

它似乎按预期工作:

scala> f(err)
res6: scalaz.\/[Boolean,Int] = -\/(false)

scala> f(\/-(\/-(5))
     | )
res7: scalaz.\/[Boolean,Int] = \/-(5)

是否有更简洁、惯用的 scalaz 方法来做到这一点?

def f(x: \/[String, Boolean \/ Int]) = x.getOrElse(-\/(false))