为什么部分应用程序需要指定参数类型?

Sum*_*uma 2 scala type-inference partial-application

为什么Scala中的部分函数应用程序需要提供类型,如:

def func(a: Int, b: Int) = ???

def func1 = func(_ : Int, 1) // compiles fine

def func1x = func(_, 1) // does not compile
// error: missing parameter type for expanded function ((x$2) => func(x$2, 1))
Run Code Online (Sandbox Code Playgroud)

为什么在这种情况下不推断类型?推断类型会导致复杂或模糊的语法,或者类型可能不像我看来那么清晰?

Mic*_*jac 5

从编译错误中,您可以看到func(_, 1)扩展为x => func(x, 1).如果你第一次写def f = x => func(x, 1),不能保证x是一个Int.遗憾的是,当没有明确给出一个类型归属时,SLS 6.23.1没有说明.

List(1, 2, 3).map(_ + 1)是因为map期望参数Int => Int.def func1x = func(_, 1)不起作用,因为func1x从右侧推断出类型,但技术上也不知道.推断它只是有意义x: Int => f(x, 1),但我猜这会增加另一个不必要的复杂性,编译器必须处理方法参数的占位符语法的极端情况.