通过将类型参数与参数的路径相关类型进行匹配来约束操作
我想利用Scala的类型系统来约束系统中的操作,在该系统中存在对某些值的版本化引用。这一切都发生在一些事务上下文
Ctx
中,它附带了一个版本类型V
。现在有一个Factory
来创建引用变量。它们是通过附加它们的创建版本创建的(类型参数V1
),对应于调用工厂的上下文版本。
现在想象一些代码试图在更高版本中访问该引用,即使用不同的Ctx
。我想要实现的是禁止在任何版本(Ctx
的V
类型字段)中调用与该创建版本不匹配的Ref
访问,但允许您通过某种替换机制解析引用Ref
的新视图,可以在当前版本中访问。 (如果用无效的上下文调用substitute
就行了,例如一个比Ref
的older3ѭ更旧 - 在这种情况下可能会抛出运行时异常)
这是我的尝试:
trait Version
trait Ctx {
type V <: Version
}
object Ref {
implicit def access[C <: Ctx, R, T](r: R)(implicit c: C, view: R => Ref[C#V, T]): T =
view(r).access(c)
implicit def substitute[C <: Ctx, T](r: Ref[_ <: Version, T])
(implicit c: C): Ref[C#V, T] = r.substitute(c)
}
trait Ref[V1 <: Version, T] {
def access(implicit c: { type V = V1 }): T // ???
def substitute[C <: Ctx](implicit c: C): Ref[C#V, T]
}
trait Factory {
def makeRef[C <: Ctx, T](init: T)(implicit c: C): Ref[C#V, T]
}
而问题是以整个事物编译的方式定义类方法access
,即复合对象的access
应该编译,但同时我不能用任何Ctx
调用这个类方法access
,只有一个版本匹配的方法参考版本。
优选地,没有结构类型或任何强加性能问题的东西。
没有找到相关结果
已邀请:
2 个回复
纫合峭
悍蕾驮苇袜
所以后续问题是 为什么我需要这种类型的冗余
的参数来实现这一点。我讨厌这些类型 参数在我的代码中像兔子一样累积。 为什么
不编译 &mdash;我可以获得按计划工作的暗示吗? 编辑: 这也是错的。方差注释是错误的。因为现在以下编译虽然它不应该: