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

时间:2016-02-10 19:23:25

标签: 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))

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

1 个答案:

答案 0 :(得分:5)

从编译错误中,您可以看到func(_, 1)扩展为x => func(x, 1)。如果您第一次撰写def f = x => func(x, 1),则无法保证xInt。遗憾的是,SLS 6.23.1没有明确说明在未明确给出类型归属时填写类型归属。

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