类型推断足够聪明,可以在使用其他类型操作类型时找出类型

时间:2014-08-21 07:03:30

标签: scala type-inference

假设此类型推断代码用于推断列表中的元素,

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.

我可以知道为什么会这样吗?

非常感谢提前

1 个答案:

答案 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的类型没有提示,编译器失败。