gpt4 book ai didi

scala - 为什么某些递归类型无法编译

转载 作者:行者123 更新时间:2023-12-02 03:01:33 26 4
gpt4 key购买 nike

我遇到了我无法理解的类型检查错误。两段代码是相似的,但只有一段可以编译。编译器给出完全无用的错误信息:

error: type arguments [I] do not conform to type DY's type parameter bounds [I <: Sample.this.Y]

有问题的代码:

trait Sample {
type X
type DX[I <: X] <: X
type Y = Aux[X]
type DY[I <: Y] <: Y
type Z = Bux[X]
type DZ[I <: Z] <: Z
type DW[I <: Z#C] <: Z#C
}
type Aux[I] = Sample { type X = I }

trait Dep {
type B
type C = Aux[B]
}
type Bux[A] = Dep { type B = A }

type UseX[I <: S#X, S <: Sample] = S#DX[I] // ok
type UseY[I <: S#Y, S <: Sample] = S#DY[I] // fails
type UseZ[I <: S#Z, S <: Sample] = S#DZ[I] // ok
type UseW[I <: S#Z#C, S <: Sample] = S#DW[I] // fails

为什么我不能引用类型本身?


更新

和我写问题时一样,我仍然很困惑。但我仍然设法欺骗编译器来完成他的工作。这只会加剧我的困惑。

问题是基于类型绑定(bind)接受或拒绝相同类型的参数。如果类型绑定(bind)与参数相同(因此引入递归),则它被拒绝。但是,如果我将递归包装在一个类型中,它通常会被接受。所以我只需要中继递归调用

trait Sample {
type X
type Y = Aux[X]
type Z = Bux[X]
type DY[I <: Y] <: Y
type DD[I <: Z] = DY[I#C]
}

type UseY[I <: S#Y, S <: Sample] = S#DY[I] // still fails
type UseD[I <: S#Z, S <: Sample] = S#DD[I] // miraculously works

但它需要在 Bux 包装器类型中包装每个类型级别的调用。

最佳答案

所以,S#Y表示“一些类型Y,在S任何实例中定义”。另一方面,type DY[I <: Y]表示“I 必须是 this 实例中声明的 Y 的子类”。

所以,当你说 type UseY[I <: S#Y, S <: Sample] = S#DY[I] , 它失败了,因为 I被限制为 Y 的子类来自一些 S ,但是DY希望它是 same 的子类 S其中 DY被宣布。

关于scala - 为什么某些递归类型无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45729325/

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