这是我的代码。
def f(x: Int) = x
val a = List(List(1), List(2, 2))
val b = a map { f(_.length) } // error
val c = a map { item => f(item.length) } // no error
当计算b出现错误时,似乎编译器以下列方式扩展代码:
val b = a map { f(x => x.length) } // absolutely wrong
这就是为什么会有错误的原因。正确的扩展类似于我在计算 c 时所做的事情。但是,当函数 f 不期望函数时,编译器如何扩展 f 的函数?
对我而言,这种扩展没有任何意义。谁能解释这种行为?谢谢!
答案 0 :(得分:0)
但是,当函数f不期望函数时,编译器如何扩展f的函数?
因为这种扩展在键入之前发生:编译器不知道String
期望的是什么。这是一件好事,因为1)在阅读代码时,也不需要知道f
是否期望函数能够理解它将如何扩展; 2)改变f
的类型并不会从根本上改变代码的含义。