假设此类型推断代码用于推断列表中的元素,
def doStuff[A](x: List[A]) = x // ignore the result
doStuff(List(3)) // I dont need to speicify the type Int here
但是,如果类型A使用其他类型操作,则类型推断不起作用,我必须指定类型。
def doStuff[A, B](x: List[A], f: (B, A) => B) = {
}
doStuff(List(3), (x: String, y) => x) //compilation failed, missing parameter type
doStuff[Int, String](List(3), (x, y) => x) //compilation fine.
我可以知道为什么会这样吗?
非常感谢提前
答案 0 :(得分:1)
类型推断仅适用于单独的参数列表。如果您将doStuff
更改为以下内容:
def doStuff[A, B](x: List[A])(f: (B, A) => B) = {
}
类型推断将按预期工作:
doStuff(List(3))((x: String, y) => x)
但请注意,类型推断是从左到右,因此如果您将Nil
作为第一个参数,它将推断A = Nothing
,这几乎不是您想要的。
<强>更新强>
在您的原始示例中,调用doStuff(List(3), (x: String, y) => x)
失败,因为无法推断lambda中y
的类型。 List(3)
位于相同的参数列表中,因此A
尚未知晓。因此,y
的类型没有提示,编译器失败。