如何在伴随对象中混合自我注释

How to mix in self annotations in companion object

考虑以下情况:

trait  M { } // uses N
object M { def apply = new M { } }
trait  N { self: L =>  }
trait  L { val m: B }
type   B

M 需要在 N 中创建的新树定义。我不想传递这些新树,因为 class 层次结构实际上很长,会导致大量代码修改。相反,我被提议做:

trait  M { self: N with L => } // uses N
object M { def apply = new M with N with L { } }
trait  N { self: L => }
trait  L { val m: B }
type   B

但我得到错误:

object creation impossible, since value m in trait L of type B is not defined

这来自对象 M 的定义。我尝试了不同的组合并且 none 有效。

如何解决这个错误?

讨论

我了解到在写 new M {} 时我得到一个匿名的 class extending (object??) M,所以我尝试修改为 new M with N with L {} 但后来我得到了未实现的错误来自 L.

的成员

参考资料

您可以在此 commit 上找到有关该问题的更多详细信息。即类型M是MeasureAnnotation,N是StructuralSize,L是SolverProvider。

如果您想构建程序,您应该 git 克隆,然后 运行 sbt 然后 universal:stage。您需要安装 z3 或 cvc4。

我认为您的代码片段没有准确反映您的实际提交。 在您的提交中,您也在对象上使用了 self 类型,这是没有意义的。特征的自我类型描述了混合在该特征中的具体实例必须满足的要求。但是,对象已经是具体类型,因此没有必要再定义进一步的要求。

简而言之:不要在伴生对象上重复特征的自我类型。