为什么下划线不像我在Scala中所期望的那样扩展?

时间:2016-10-04 03:56:36

标签: scala

这是我的代码。

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 的函数?

对我而言,这种扩展没有任何意义。谁能解释这种行为?谢谢!

1 个答案:

答案 0 :(得分:0)

  

但是,当函数f不期望函数时,编译器如何扩展f的函数?

因为这种扩展在键入之前发生:编译器不知道String期望的是什么。这是一件好事,因为1)在阅读代码时,不需要知道f是否期望函数能够理解它将如何扩展; 2)改变f的类型并不会从根本上改变代码的含义。