gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:51:29 24 4
gpt4 key购买 nike

为什么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)

根据需要。

关于scala - 将部分类型参数列表推断为泛型值参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29201990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com