如何将这个地图/ flatMap转换成用于理解在Scala呢?(How to convert thi

2019-08-01 06:01发布

如何将这个地图/ flatMap转换成的理解,并请解释它是如何工作的,谢谢。

    def compute2(maybeFoo: Option[Foo]): Option[Int] =
      maybeFoo.flatMap { foo =>
      foo.bar.flatMap { bar =>
          bar.baz.map { baz =>
          baz.compute
      }
    }
  }  

Answer 1:

您的代码可以翻译成这样:

def compute2(maybeFoo: Option[Foo]): Option[Int] =
  for {
    foo <- maybeFoo
    bar <- foo.bar
    baz <- bar.baz
  } yield baz.compute

从行情Scala中,第二版程序 :

一般地,用于表达的形式为:

for ( seq ) yield expr

这里,SEQ是发电机,定义,和过滤器的一个序列,在连续元件之间的分号。

这种用于表达包含一个发生器,一个定义,并且一个过滤器:

for {
p <- persons // a generator
n = p.name // a definition
if (n startsWith "To") // a filter
} yield n

翻译与一个生成器表达式

首先,假设你有表达一个简单的:

for (x <- expr1) yield expr2

其中x是一个变量。 这样的表达式翻译成:

expr1.map(x => expr2)

翻译开始用发电机和一个过滤器表达式

现在,考虑与其他一些元素结合的领先发电机表达式。 一种形式的表达:

for (x <- expr1 if expr2) yield expr3

被翻译成:

expr1 withFilter (x => expr2) map (x => expr3)

对于翻译起始两台发电机表达式

接下来的情况下,负责处理与两台发电机启动,作为表达式:

for (x <- expr1; y <- expr2) yield expr3

所述用于表达上述被转换为flatMap的应用:

expr1.flatMap(x => for (y <- expr2) yield expr3)


文章来源: How to convert this map/flatMap into a for comprehension in Scala?