当前位置: 首页 > 知识库问答 >
问题:

如何将这张地图/平面地图转换为Scala中的理解地图?

邬飞捷
2023-03-14

如何将此地图/平面图转换为便于理解的图形,请解释其工作原理,谢谢。

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

共有1个答案

凤凡
2023-03-14

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

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

引用自Scgraming in Scala,第二版:

通常,for表达式的形式为:

for ( seq ) yield expr

这里,seq是一系列生成器、定义和过滤器,在连续元素之间带有分号。

这个for表达式包含一个生成器、一个定义和一个过滤器:

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)

翻译以生成器和过滤器开头的表达式

现在,考虑将前导生成器与其他一些元素结合在一起的表达式。A用于表单的表达式:

for (x <- expr1 if expr2) yield expr3

被翻译成:

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

从两个生成器开始的表达式的翻译

下一个案例处理以两个生成器开头的表达式,如:

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

上面的 for 表达式被转换为 flatMap 的应用程序:

expr1.flatMap(x => for (y <- expr2) yield expr3)
 类似资料: