【问题标题】:How to convert this map/flatMap into a for comprehension in Scala?如何将此地图/平面地图转换为Scala中的理解?
【发布时间】:2012-10-09 12:41:38
【问题描述】:

如何将这个map/flatMap转换成for理解,请解释一下它是如何工作的,谢谢。

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

【问题讨论】:

    标签: scala monads for-comprehension


    【解决方案1】:

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

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

    引用Programming in Scala, Second Edition:

    通常,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 表达式:

    for (x <- expr1) yield expr2
    

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

    expr1.map(x => expr2)
    

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

    现在,考虑将前导生成器与一些 其他元素。 A for 的表达形式:

    for (x <- expr1 if expr2) yield expr3
    

    翻译成:

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

    翻译以两个生成器开头的表达式

    以两个生成器开头的表达式的下一个 case 句柄,如下所示:

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

    上面的for表达式被翻译成flatMap的一个应用:

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

    【讨论】:

    • 好的,我想我明白了,事实上,我现在可以使用那段代码以及我的下一段 def simpleProgram : Future[Int] = { for { result
    猜你喜欢
    • 2014-10-28
    • 2020-07-06
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2023-01-13
    相关资源
    最近更新 更多