如何用orElse组合返回Option的函数?

Mic*_*ael 3 scala pointfree

假设我有两个函数foo: Int => Option[Int],bar: Int => Option[Int]并使用它们来处理列表:

val xs: List[Int] = ...
xs flatMap {x => foo(x) orElse bar(x)}
Run Code Online (Sandbox Code Playgroud)

我可以写xs flatMap (foo orElse bar)而不是{x => foo(x) orElse bar(x)}吗?
我可以使用3d派对库.

Jes*_*per 6

据我所知,标准库中没有这样的东西,但您可以使用隐式类自己添加:

implicit class WithOrElse[T, R](f: T => Option[R]) {
  def orElse(g: T => Option[R])(x: T) = f(x) orElse g(x)
}
Run Code Online (Sandbox Code Playgroud)

例:

val foo: Int => Option[Int] = x => if (x % 2 == 0) Some(x) else None
val bar: Int => Option[Int] = x => if (x % 3 == 0) Some(x) else None

val xs = List(1, 2, 3, 4, 5, 6, 7, 8)

xs flatMap (foo orElse bar)
Run Code Online (Sandbox Code Playgroud)