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

2024-05-16

为什么此 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 a="A0}]”。有解决方法吗?</didom-fragment">

Edit:正如已经指出的,一致性错误源于未能验证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]

尽管这里的类型细化似乎没有添加任何新信息。 (也可以看看为什么带有类型投影的循环引用是非法的? https://stackoverflow.com/questions/6719827/why-is-this-cyclic-reference-with-a-type-projection-illegal)

我的动机是创造一种特质Foo[S <: T]专门从事S#A,如:如何专注于 Scala 中的类型投影? https://stackoverflow.com/questions/6631155/how-to-specialize-on-a-type-projection-in-scala为了让它发挥作用,我正在尝试浮出水面S#A作为显式参数A0在实施特征中GenFoo,可以直接专门化。我希望将迈尔斯·萨宾(Miles Sabin)的答案中的类型细化思想应用到为什么带有类型投影的循环引用是非法的? https://stackoverflow.com/questions/6719827/why-is-this-cyclic-reference-with-a-type-projection-illegal但我遇到了这个一致性错误。


这似乎就是答案:

S专攻A型​​?

关于的问题专门化来自这里:T { type A = A0 }。这是类型T with type A 专门-- 意思是,它比原来的限制更多T.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这些类型参数不符合类型细化? 的相关文章

随机推荐