Scala模式匹配特征中的对象

时间:2018-01-28 12:30:08

标签: scala pattern-matching

我有一个包含多个案例类和对象的特征,例如:

trait Logic[A <: Logic[A]] {
   case class And(l: Logic[A], l2: Logic[A]) extends Logic[A]
   trait Atom extends Logic[A]
   case object True extends Atom
   case object False extends Atom
 //  ...
}

trait LTLLogic extends Logic[LTLLogic]
object LTLLogic extends Logic[LTLLogic]

现在我想要匹配Logic[A]类型的公式。

class Matcher[A <: Logic[A]] {

 def matchFormula(f: Logic[A]) = f match {
   case a: Logic[A]#And => //do something
   case Logic[A]#True => //<< not working
   case Logic[A]#False => //<< not working
   case _ => //other cases
 }

}

问题是,与Logic[A]#And的匹配工作正常,但我无法与TrueFalse匹配。如果我与班级匹配,我可能会得到它的工作:

   case a:Logic[A]#Atom if a.getClass == a.True.getClass => //do something
   case a:Logic[A]#Atom if a.getClass == a.False.getClass => //do something

但我真的不喜欢这个解决方案。有没有其他方法可以使它工作?

看起来路径依赖类型不是正确的工具。 按照建议,将案例类/对象从trait移到object Logic并在逻辑协变中生成A似乎正在起作用。

trait Logic[+A <: Logic[A]]
object Logic{
   case class And[A <: Logic[A]](l: Logic[A], l2: Logic[A]) extends Logic[A]
   trait Atom[A <: Logic[A]] extends Logic[A]
   case object True extends Atom[Nothing]
   case object False extends Atom[Nothing]
}

0 个答案:

没有答案
相关问题