【问题标题】:Overriding functions with path-dependent type parameters使用依赖于路径的类型参数覆盖函数
【发布时间】:2011-10-24 22:18:48
【问题描述】:

编辑:感谢 Derek 指出错误消息的关键部分,我能够提取更多关键部分,它似乎与存在类型有关。如果我在语言参考中正确理解了§3.2.10 Existential Quantification over Values,那么val m: Map[x.type#S, x.type#S] forSome { val x: T }val m: Map[t#S, t#S] forSome { type t <: T with Singleton } 的简写。然而在下面的代码中,它们的行为确实不同。

trait Type {
  type S
}

class Concrete extends Type {
  type S = Double
}

trait BaseWorks {
  type T <: Type
  val m: t#S forSome { type t <: T with Singleton }
}

class Works extends BaseWorks {
  override type T = Concrete
  override val m = 0.0
}

trait BaseError {
  type T <: Type
  val m: x.type#S forSome { val x: T }
}

class Error extends BaseError {
  override type T = Concrete
  override val m = 0.0
}

精炼BaseWorks 有效,而精炼BaseError 会导致错误error: overriding value m in trait BaseError of type Error.this.x.S forSome { val x: =&gt; Error.this.T }; value m has incompatible type。我是否误解了 §3.2.10?

原帖:在下面一段 Scala 代码中,编译器 (2.9.0.1) 产生一个错误,指出方法 f2 不会覆盖 Derived 中的任何内容。

abstract trait Type {
  type T1
  type T2
  type P = (T1, T2)
}

class ConcreteType extends Type {
  type T1 = Double
  type T2 = Double
}

abstract class Base {
  type T <: Type
  type TP = T#P
  def f1(v: TP): TP
  def f2(v: T#P): T#P
  def f3(v: T#P): T#P
}

class Derived extends Base {
  override type T = ConcreteType
  override def f1(v: TP): TP = v
  override def f2(v: T#P): T#P = v
  override def f3(v: TP): TP = v
}

另一方面,使用代码中显示的完全相同的签名覆盖函数f3 是有效的。我希望这两个函数的行为方式相同。为什么不是这样?

【问题讨论】:

标签: scala abstract-data-type path-dependent-type existential-type


【解决方案1】:

(仅供参考,我使用的是 2.9.0.1)

我无法在规范中找到导致此问题的原因,但您收到的错误消息至少说明了最终原因。这是关键部分:

(Note that (_5.T1, _5.T2) forSome { val _5: Base.this.T }
does not match
(_16.T1, _16.T2) forSome { val _16: Base#T }

Base.this.T 不等同于Base#T。前者是基于实例this 的路径依赖类型,而后者是不基于实例的类型投影。

这似乎是由于类型解析的顺序。 TP 是针对 Base 的评估来解决的,而 T#P 是针对 Derived 的评估来解决的。

如果有人可以指出规范中可以正确解释这一点的位置,我很乐意阅读。

【讨论】:

  • 嗨,德里克。感谢您指出关键部分。我能够更多地提取关键部分。我会更新上面的帖子。
猜你喜欢
  • 2023-03-05
  • 2021-03-22
  • 2016-06-04
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2015-12-31
  • 2013-09-11
  • 2019-12-11
相关资源
最近更新 更多