gpt4 book ai didi

scala - 错误,高级类型 Scala : type arguments do not conform. 类型 T 的边界比类型 T 的声明边界更严格

转载 作者:行者123 更新时间:2023-12-04 18:05:57 24 4
gpt4 key购买 nike

这是 Scala REPL 中的一个简单实验:

scala> trait A; trait B extends A; trait C extends B
defined trait A
defined trait B
defined trait C

scala> trait TC[T]
defined trait TC

scala> trait TC2[T <: B]
defined trait TC2

scala> class Test[TC[T]]
warning: there was one feature warning; re-run with -feature for details
defined class Test

scala> new Test[TC]
res1: Test[TC] = Test@6f195bc3

scala> new Test[TC2]



<console>:11: error: kinds of the type arguments (TC2) do not conform to the expected kinds of the type parameters (type TC) in class Test.
TC2's type parameters do not match type TC's expected parameters:
type T (in trait TC2)'s bounds <: B are stricter than type T's declared bounds >: Nothing <: Any
val res2 =
^
<console>:12: error: kinds of the type arguments (TC2) do not conform to the expected kinds of the type parameters (type TC) in class Test.
TC2's type parameters do not match type TC's expected parameters:
type T (in trait TC2)'s bounds <: B are stricter than type T's declared bounds >: Nothing <: Any
new Test[TC2]
^

问题一:

如何根据 Scala 语言规范解释这些错误消息?

换句话说,SLS 的哪些部分解释了这些错误消息?

问题2: ,如何在 中解释这些错误信息简单术语 (不是基于 SLS)?

用编译器的话来说上一个问题:

为什么 TC2's type parameters do not match type TC's expected parameters会出现问题,即 type T (in trait TC2)'s bounds <: B are stricter than type T's declared bounds >: Nothing ?

是否有任何书籍或文章解释了此错误消息背后的原因?

也许在皮尔斯的 TAPL 书中的某个地方?

最佳答案

正如我在上面的评论中所指出的,TCTest的类型参数列表中(并在错误消息中)不是 TC你之前定义了几行——这是一个新的类型构造函数参数,它隐藏了特征 TC .

(作为旁注,我强烈建议不要隐藏类型参数。在值级别隐藏变量可能会令人困惑,但隐藏类型参数几乎总是混淆的秘诀。)

类型构造函数参数在规范的 4.4 节中讨论。从该部分:

A type constructor parameter adds a nested type parameter clause to the type parameter... The above scoping restrictions are generalized to the case of nested type parameter clauses, which declare higher-order type parameters. Higher-order type parameters (the type parameters of a type parameter t) are only visible in their immediately surrounding parameter clause (possibly including clauses at a deeper nesting level) and in the bounds of t.



您的 T这是这些高阶类型参数之一。它可以是有界的(就像任何其他类型参数一样),但不是。这就是导致错误的原因:您试图提供一个类型构造函数来约束其类型参数( TC2 )作为不共享约束的类型构造函数参数的值(实际上没有任何限制)。

要直观地了解这是一个问题的原因,请考虑以下特征:
trait Foo[X[_]] {
def create[A]: X[A]
}

这是一个完全合理的写法——我可以像这样创建一个实例:
object ListFoo extends Foo[List] {
def create[A]: List[A] = Nil
}

现在假设我有一个带有约束的类型构造函数:
trait MyIntOptionThingy[A <: Option[Int]]

编译器禁止我实例化 Foo[MyIntOptionThingy]因为 MyIntOptionThingy的类型参数约束比 X 的类型参数更严格在 Foo的类型参数列表。如果您考虑一下,这是有道理的:我将如何定义 create对于任何 A ,当只有 A s 适用于 MyIntOptionThingySome[Int] , None.type , 和 Option[Int] ?

关于scala - 错误,高级类型 Scala : type arguments do not conform. 类型 T 的边界比类型 T 的声明边界更严格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27800502/

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