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

Dan*_*ias 2 scala typeclass

为什么 Scala 不能像这样推断?

def notInfering[A,B,C](aa: A=>Boolean, bbcc: Tuple2[B,C]) = bbcc
notInfering[Int]((_ > 3), ("string", 123))
Run Code Online (Sandbox Code Playgroud)

编译器生气地说我需要指定类型参数 B 和 C。

这些工作,但它们并不理想:

notInfering[Int,String,Int]((_ > 2), ("string", 123))
notInfering(((a: Int) => a > 2), ("string", 123))
Run Code Online (Sandbox Code Playgroud)

理论上,Scala 不应该能够推断出最后两个参数吗?这可以用另一种方式完成或表达吗?如果不是,这是否是 Scala 能够推断部分类型参数列表的一个好功能?

Ben*_*ich 5

理论上,一种语言可以实现所描述的功能。只是 Scala 目前没有。

首先,您所描述的根本不是 Scala 语法的一部分。指定类型参数时,它是一种全有或全无的语法。您要么需要所有类型参数,要么让编译器推断它们。

其次,请记住类型推断并不完美。有很多情况可以手动推断类型参数,但编译器无法弄清楚。Scala 编译器在类型消歧和推导方面令人印象深刻,但它并不神奇!

最后,这可以使用 Scala 和一个包含第一个类型参数的中间闭包类(可以是一个匿名类)来表达:

object Foo {
    def inferring[A](aa: A => Boolean) = new {
        def apply[B, C](bbcc: (B, C)) = bbcc
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

Foo.inferring[Int](_ > 3)("string" -> 123)
Run Code Online (Sandbox Code Playgroud)

如预期的。