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

为什么下划线不像我在Scala中预期的那样扩展?,scala,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 这就是为什么会有错误。正

这是我的密码

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
的类型不会从根本上改变代码的含义。

它会按预期扩展。只是你的期望不正确。如果你考虑比较整个事物与模式匹配…你应该能够看到哪里出了问题。虽然。。。这并不完全正确。。。为了理解,只需将一个
.map(u.length)
想象成类似于这个
map(x=>x match{case}x.length})
。现在你写的是
a.map(f(x=>x match{case{u=>x.length}))
@Micho我不同意这个问题是重复的。这里的答案只说明占位符语法是如何扩展的,但问题作者已经知道了。@SarveshKumarSingh Thx!你的例子真的帮助了我:)