鉴于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>
在这种情况下,类型推断对部分应用函数没有帮助的原因是什么?
答案 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
的类型。
是否可以将其更改为在此特定情况下工作?当然。变化值得吗?可能不是。