为什么scala不推断部分应用函数的类型?

时间:2017-02-28 04:48:45

标签: scala type-inference partially-applied-type

鉴于scala的类型推断,我希望不会失败:

scala> def partiallyApplied(x: Int, y: Int, z: Int) = x + y + z
partiallyApplied: (x: Int, y: Int, z: Int)Int

scala> val partialSum = partiallyApplied(2, 3, _)
<console>:11: error: missing parameter type for expanded function ((x$1) => partiallyApplied(2, 3, x$1))
   val partialSum = partiallyApplied(2, 3, _)
                                           ^

当然,这有效:

scala> val partialSum = partiallyApplied(2, 3, _:Int)
partialSum: Int => Int = <function1>

在这种情况下,类型推断对部分应用函数没有帮助的原因是什么?

1 个答案:

答案 0 :(得分:1)

Scala specification确切地说在哪些情况下可以省略参数类型,而这不是其中之一:

  

如果匿名函数的预期类型是scala.FunctionN[S1,…,Sn, R]形状,或者可以SAM转换为这样的函数类型,则类型   Ti    一个参数   xi    可以省略,至于   Si    在预期的类型中定义,和   Ti = Si    假设。此外,类型检查时的预期类型e    是R

     

如果函数文字没有预期的类型,则所有形式参数类型Ti    必须明确指定,并期望e的类型    未定义。匿名函数的类型为scala.FunctionN[T1,…,Tn, R],其中R    是e的打包类型。 R必须等同于不引用任何形式参数xi的类型。

是否可以将其更改为在此特定情况下工作?当然。变化值得吗?可能不是。

相关问题