使用下划线在“Function2”参数上输入类型推断失败

时间:2013-11-29 11:05:58

标签: scala type-inference

为什么类型推断器会放弃这个:

def test(a: Seq[Int], b: Seq[Int]) = (a, b).zipped.map((_ + _) / 2)   // no

像这样:

<console>:35: error: missing parameter type for expanded function 
              ((x$1, x$2) => x$1.$plus(x$2))
       def test(a: Seq[Int], b: Seq[Int]) = (a, b).zipped.map((_ + _) / 2)
                                                               ^

这是一个奇怪的微妙,似乎与括号有关。例如,不使用中缀语法就可以了:

def test(a: Seq[Int], b: Seq[Int]) = (a, b).zipped.map(_.+(_) / 2)   // yes

如果我为了它的乐趣添加另一对括号,它会再次失败:

def test(a: Seq[Int], b: Seq[Int]) = (a, b).zipped.map((_.+(_)) / 2)   // no

1 个答案:

答案 0 :(得分:3)

我不记得它写在SLS的哪个地方,但是lambda去了最近的范围。 Map需要一个函数(Int, Int) => B,因此当您编写map(_.+(_) / 2)时,它会被置于预期之内。但是在((_ + _) / 2)((_.+(_)) / 2)的情况下,你的lambda被贬为(((x, y) => x + y) / 2),基本上你正试图用2来设计一个函数,这就是为什么Scalac不能推断类型