这是我的代码。
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的函数?
对我来说,这种扩展没有任何意义。有人能解释这种行为吗?谢谢!
然而,当函数f不期望函数时,编译器如何为f扩展函数?
因为这个展开发生在输入之前:编译器还不知道f
期望什么。这是一件好事,因为1)当阅读代码时,你也不需要知道f
是否期望函数理解它将如何展开;2)改变f
的类型并不会从根本上改变代码的含义。