微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法从有效类型中排除“Nothing”而不将自己限制为线性继承路径?

如何解决有没有办法从有效类型中排除“Nothing”而不将自己限制为线性继承路径?

我必须承认,我在这里抱有希望,但在我真的很想以某种方式工作的情况下再次偶然发现了这个问题。我的问题与逆变有关:它不仅可以表达对给定类型值的依赖,而且通过一致使用类型参数,还可以表达非常任意的抽象概念。例如,我的案例涉及递归构建更高的幻影类型来表达某些域级属性。现在,nothing 在许多方面都非常有用,当您仅将类型用作值指示符时(基本上是函数参数),这不是问题,因为您无法提供它的值。但是,您可以使用 nothings 参数化更高的类型,它会开始显示它的 hack 情况。

trait Seal[X <: Phantom]
trait Contra[-X <: Phantom] {
    //def apply[U >: X <: Phantom](seal :Seal[U]) //what I'd like
    //what I can have:
    def sub[L <: X](seal :Seal[L]) //the opposite of what holds in reality
    def workaround[L <: X,U >: L <: Phantom](seal :Seal[U]) //would work!!!
}
  • Type X(即参数)是一个复杂的幻像类型。
  • 类型 Seal 是不变的,因为它作为 X 的一种载体,保证其所有属性都被保留。它们总是使用一些超类型 X >: Source <: Phantom 进行参数化,通过超类型 Source 的那些位来“擦除”,这些位在用例中是不相关的(如果有帮助,可以将其视为位图)。
  • 类型 Contra 仅对 X 的某些属性感兴趣,并且其工厂方法仅在它们持有且子类型无法更改它们的情况下才允许构造。

代码示例总结了我的困境。第三种方法令人困惑,看起来我不知道我想要什么,但它实际上可以完美运行:在上面的术语中,它说 Seal[U] 来自 Source一个实例,该实例展示了支持的质量/需要 Contra。也就是说,如果不是为了 nothing,它会退化每种情况,因为任何 Contra[_] <: Contra[nothing]Contra[nothing] 都会自动接受任何 Seal[_]

将我自己的交集类型添加X 的下界是行不通的,因为 X 的各种类型实例是互斥的:交集类型将继承类型构造函数的不同实例;此外,它对扩展是封闭的,但是,虽然有限制,但仍然有一些用处。

对我可以探索的途径有什么想法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。