为什么Scala不能这么推断?
def notInfering[A,B,C](aa: A=>Boolean, bbcc: Tuple2[B,C]) = bbcc
notInfering[Int]((_ > 3), ("string", 123))
编译器愤怒地说我需要指定类型参数B和C.
这些工作,但它们并不理想:
notInfering[Int,String,Int]((_ > 2), ("string", 123))
notInfering(((a: Int) => a > 2), ("string", 123))
理论上,Scala不应该能够推断出最后两个参数吗?这可以用另一种方式完成或表达吗?如果没有,这是否是Scala能够推断出部分类型参数列表的一个很好的特性?
答案 0 :(得分:4)
理论上,语言可以实现所描述的功能。只是Scala目前没有。
首先,您所描述的内容并不是Scala语法的一部分。指定类型参数时,它是一种全有或全无的语法。您需要所有类型参数,或者让编译器推断它们。
其次,请记住,类型推断并不完美。在很多情况下,可以手动推断类型参数,但编译器无法弄清楚。 Scala编译器在类型消歧和演绎方面令人印象深刻,但它并不神奇!
最后,这可以使用Scala表示,中间闭包类(可以是一个匿名类)保存第一个类型参数:
object Foo {
def inferring[A](aa: A => Boolean) = new {
def apply[B, C](bbcc: (B, C)) = bbcc
}
}
然后你可以这样做:
Foo.inferring[Int](_ > 3)("string" -> 123)
根据需要。