"unbound placeholder parameter" 的解释

Explanation of "unbound placeholder parameter"

问题

为什么情况 2 导致 "unbound placeholder parameter" 而情况 1 正常?

案例一

val h: (Int => Int) = (x:Int) => { scala.util.Random.nextInt(x) }
val _h: (Int => Int) = { scala.util.Random.nextInt(_) }
h(5)     // 3
_h(5)    // 3

案例二

val f: (Int => Int) = (x:Int) => { x }
f(5)     // 5
// Causes error
val _f: (Int => Int) = { _ }   <----- unbound placeholder parameter

_ 在 Scala 中永远不会被解释为 x => x

如果我正确理解 language spec 中关于 "binding underscore sections" 的部分,那正是因为 Scala 为部分应用保留了 _。就像 scala.util.Random.nextInt(_) 的情况一样,它意味着 x => nextInt(x) 而不是 nextInt(x => x).

.nextInt(_) 不是占位符用法的示例。在这种情况下,下划线 _ 用于 nextInt() 方法的 "eta expansion",即将方法提升为适当的功能。结果等同于:

val _h: (Int => Int) = util.Random.nextInt

要使您的 _f() 代码正常工作,您可以这样做。

val _f: (Int => Int) = identity