为什么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))
为什么在这种情况下不推断类型?推断类型会导致复杂或模糊的语法,或者类型可能不像我看来那么清晰?
答案 0 :(得分: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)
只会有意义,但我猜这会给编译器增加另一个不必要的复杂性,使得必须处理方法参数上占位符语法的极端情况。