Scala 以惯用的方式组合选项

Scala 以惯用的方式组合选项,scala,functional-programming,Scala,Functional Programming,我将用Scala写这篇文章,但它更多的是一个函数编程问题 我有 def foo(x: A): Option[B] 及 以下最简单的方法是什么: def compose(x:A, y:A): Option[C] 这样,如果foo(y)中的任何一个foo(x)为None,那么compose(x,y)为None,否则compose(x,y)为bar(foo(x).get,foo(y).get)。我能想到的最好办法是: foo(a).flatMap( aRes => foo(b).map( b

我将用Scala写这篇文章,但它更多的是一个函数编程问题

我有

def foo(x: A): Option[B]

以下最简单的方法是什么:

def compose(x:A, y:A): Option[C]
这样,如果foo(y)中的任何一个foo(x)为None,那么compose(x,y)为None,否则compose(x,y)为bar(foo(x).get,foo(y).get)。我能想到的最好办法是:

foo(a).flatMap( aRes => foo(b).map( bRes => bar(a,b)))
那么:

for (x <- foo(a); y <- foo(b)) yield bar(x,y) 
用于(x-y)
对于(x如何:

for (x <- foo(a); y <- foo(b)) yield bar(x,y) 
用于(x-y)

对于(x,以下是您当前解决方案的语法糖:

def compose(x: A, y: A): Option[C] = for {
  fx <- foo(x)
  fy <- foo(y)
} yield bar(fx, fy)

这将产生与上述实现相同的结果,但使用更合适的抽象。

以下是当前解决方案的语法糖:

def compose(x: A, y: A): Option[C] = for {
  fx <- foo(x)
  fy <- foo(y)
} yield bar(fx, fy)
这将产生与上述实现相同的结果,但使用更合适的抽象

def compose(x: A, y: A): Option[C] = for {
  fx <- foo(x)
  fy <- foo(y)
} yield bar(fx, fy)
import scalaz._, Scalaz._

def compose(x: A, y: A): Option[C] = (foo(x) |@| foo(y))(bar)