Scala 将部分类型参数列表推断为泛型值参数

Scala 将部分类型参数列表推断为泛型值参数,scala,typeclass,Scala,Typeclass,为什么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

为什么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能够推断部分类型参数列表的一个好功能?

理论上,语言可以实现所描述的功能。只是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)
如所愿