gpt4 book ai didi

scala - 为什么这些类型参数不符合类型细化?

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

为什么此 Scala 代码无法进行类型检查?

trait T { type A }
trait GenFoo[A0, S <: T { type A = A0 }]
trait Foo[S <: T] extends GenFoo[S#A, S]

我不明白为什么“类型参数 [S#A,S] 不符合特征 GenFoo 的类型参数边界 [A0,S <: T{type A = A0}]”。有解决办法吗?

编辑:正如已经指出的,一致性错误源于未能验证 S <: T{type A = S#A} 。丹尼尔·索布拉尔指出-explaintypes ,这告诉我们:

S <: T{type A = S#A}?
S <: T?
true
S specializes type A?
this.A = this.A?
S = this.type?
false
false
false
false

我不知道如何解释这一点。

请注意,如果我们尝试定义,我们会得到非法循环引用,

trait Foo[S <: T { type A = S#A } ] extends GenFoo[S#A, S]

虽然这里的类型细化似乎没有添加任何新信息。 (另请参阅Why is this cyclic reference with a type projection illegal?)

我的动机是创造一种特质Foo[S <: T]专门从事 S#A ,如:How to specialize on a type projection in Scala?为了让它发挥作用,我正在尝试显示 S#A作为显式参数 A0在实现特征中GenFoo ,可以直接专门化。我希望应用 Miles Sabin 对 Why is this cyclic reference with a type projection illegal? 的回答中的类型细化思想。但我遇到了这个一致性错误。

最佳答案

这似乎就是答案:

S specializes type A?

关于专业的问题来自这里:T { type A = A0 }。这是类型 TA 类型 专用 - 意思是,它比原始 T 受到更多限制。

这个问题的答案是否定的——S 没有任何限制使其可以专门化。

关于scala - 为什么这些类型参数不符合类型细化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6795623/

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