“for”翻译成列出高阶函数

时间:2014-11-26 16:40:22

标签: scala

据我所知,for表达式被翻译成Scala表达式,这些表达式构建于:

  • 地图
  • flatMap
  • filterWith
  • 的foreach

高阶列表方法。

一个常见的例子是:

for(b1 <= books; b2 <- books if b1 != b2;
    a1 <- b1.authors; a2 <- b2.authors if a1 == a2) yield a1;

结果:

books flatMap (b1 => 
    books withFilter( b2 => b1 != b2) flatMap( b2 => 
        b1.authors flatMap ( a1 => 
            b2.authors withFilter ( a2 => a2 == a1 ) map ( a2 => a1 )
        )
    )
)

其中:

  • books是一个类Book对象列表(List[Book]
  • Book的公开属性authors类型为List[String]

我的问题是关于这一行:

b2.authors withFilter ( a2 => a2 == a1 ) map ( a2 => a1 )

由于条件为a2 == a1,该行等同于:

b2.authors withFilter ( a2 => a2 == a1 ) map ( x => x )

为什么生成的代码不仅仅是?

b2.authors filter ( a2 => a2 == a1 )

可以解释一下这个例子是Scala编译器自动生成的代码的再现吗?

“建筑砖块”中有filter吗?

1 个答案:

答案 0 :(得分:1)

for / yield语法转换为方法调用非常简单和机械,几乎处于字符串操作的级别。 withFilter因其懒惰而在某些地方是必要的,因此为了简单起见,它在各地都被使用。我不明白你的最后一个问题的措辞,但是for / yield表达式是AIUI从未转换为对filter的调用,除了对于尚未拥有的对象的弃用方式withFilter方法。