我想利用 Scala 的类型系统来限制系统中的操作,其中存在对某些值的版本化引用。这一切都发生在一些附加Ctx
了版本类型的事务上下文中。V
现在有一个Factory
创建参考变量。它们是通过附加的创建V1
版本(类型参数)创建的,对应于调用工厂的上下文版本。
现在想象一些代码试图在更高版本中访问该引用,即使用不同的Ctx
. 我想要实现的是禁止在与创建版本不匹配的Ref
任何版本(Ctx
的V
类型字段)中调用访问权限,但允许您通过一些返回新的替换机制来解析引用Ref
可以在当前版本中访问的视图。(如果substitute
使用无效的上下文调用它是可以的,例如,一个比Ref
's旧的上下文V1
——在这种情况下,可能会引发运行时异常)
这是我的尝试:
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
应该编译,但同时我不能access
用any Ctx
调用这个类方法,只能用一个版本与引用版本匹配的方法。
最好没有结构类型或任何强加性能问题的东西。