什么时候进行类型检查以获得理解?

时间:2018-07-24 20:46:53

标签: scala typechecking for-comprehension

关于用formapflatMap来简化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)
                                               ^

在我看来,这与书中所说的相矛盾,因为看来类型检查是在废止之前进行的。也许...

  • 我对这本书有误解,在这种情况下请给我启发-特别是,请您在减糖前后检查什么类型?
  • 编译器类型检查结果映射,发现不一致之处,然后使用for表达式记录问题,以便于调试

1 个答案:

答案 0 :(得分:1)

我相信您的第二个建议是正确的。这两种类型错误都在转换后发生,但是如果编译器在给您该错误时将您指向某些生成的代码,则将很烦人。想象一下,它发出了以下消息:

<console>:12: error: type mismatch;
 found   : String
 required: Double
       List("a", "b").map(x => math.pow(x, 2))
                                        ^

然后,您必须坐在那里思考一下这段代码是什么-您没有写任何对map的调用或类似的匿名函数。如果理解变得更复杂,并导致多个嵌套的flatMapwithFilter和其他东西,那就更糟了10倍。因此,它会将您指向您实际编写的预转换版本。