“未绑定占位符参数”的说明

时间:2019-12-03 10:55:45

标签: scala function scala-placeholder-syntax

问题

为什么在情况1正常的情况下情况2导致“未绑定占位符参数”?

案例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

案例2

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

2 个答案:

答案 0 :(得分:1)

_在Scala中从不解释为x => x

如果我正确理解language spec中有关“绑定下划线部分”的部分,那恰恰是因为Scala为部分应用保留了_。就像在scala.util.Random.nextInt(_)的情况下一样,它表示x => nextInt(x)而不是nextInt(x => x)

答案 1 :(得分:1)

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

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

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

val _f: (Int => Int) = identity