关于用for
,map
和flatMap
来简化withFilter
表达式的主题,《 在Scala中编程第三版》中的书说(在“重新表达”一章中
for
表达式的翻译发生在类型检查之前。这提供了最大的灵活性,因为唯一的要求就是扩展for
表达式类型检查的结果。
但是,在REPL中,
for (x: Int <- List("a", "b")) yield x
给予
<console>:12: error: scrutinee is incompatible with pattern type;
found : Int
required: String
for(x: Int <- List("a", "b")) yield x
^
同样,
for(x <- List("a", "b")) yield math.pow(x, 2)
给予
<console>:12: error: type mismatch;
found : String
required: Double
for(x <- List("a", "b")) yield math.pow(x, 2)
^
在我看来,这与书中所说的相矛盾,因为看来类型检查是在废止之前进行的。也许...
答案 0 :(得分:1)
我相信您的第二个建议是正确的。这两种类型错误都在转换后发生,但是如果编译器在给您该错误时将您指向某些生成的代码,则将很烦人。想象一下,它发出了以下消息:
<console>:12: error: type mismatch;
found : String
required: Double
List("a", "b").map(x => math.pow(x, 2))
^
然后,您必须坐在那里思考一下这段代码是什么-您没有写任何对map
的调用或类似的匿名函数。如果理解变得更复杂,并导致多个嵌套的flatMap
和withFilter
和其他东西,那就更糟了10倍。因此,它会将您指向您实际编写的预转换版本。