Scala 使用变量绑定的替代模式匹配?

Scala 使用变量绑定的替代模式匹配?,scala,Scala,我尝试在术语上实现一个等价关系,我也想与一些模式匹配。然而,我的关系是对称的,因此,模式匹配也必须反映这一点 请看以下示例: abstract class Term case class Constructor(txt:String) extends Term case class Variable(txt:String) extends Term case class Equality(t1:Term, t2:Term) def foobar(e:Equality) = e match {

我尝试在术语上实现一个等价关系,我也想与一些模式匹配。然而,我的关系是对称的,因此,模式匹配也必须反映这一点

请看以下示例:

abstract class Term
case class Constructor(txt:String) extends Term
case class Variable(txt:String) extends Term

case class Equality(t1:Term, t2:Term)

def foobar(e:Equality) = e match {
    case Equality(Variable(x),Constructor(y)) => "do something rather complicated with x and y"
    case Equality(Constructor(y),Variable(x)) => "do it all over again"
}
事实上,我想做这样的事情

def foobar(e:Equality) = e match {
    case Equality(Variable(x),Constructor(y)) | Equality(Constructor(y),Variable(x)) 
        => "yeah! this time we need to write the code only one time ;-)"
}

但是,如中所述,这是不允许的。有人有解决这类问题的好办法吗?非常感谢任何帮助/指针。

您可以创建自己的unapply方法,如下所示:

object CVEquality {
  def unapply(e: Equality): Option(String, String) = e match {
    case Equality(Variable(v), Constructor(c)) => Some(c -> v)
    case Equality(Constructor(c), Variable(v)) => Some(c -> v)
    case _ => None
  }
}
用法:

def foobar(e:Equality) = e match {
    case CVEquality(c, v) => "do something rather complicated with c and v"
}
最简单的方法是为相当复杂的
创建方法:

def complicated(c: String, v: String) = "do something rather complicated with c and v"

def foobar(e:Equality) = e match {
    case Equality(Variable(x),Constructor(y)) => complicated(y, x)
    case Equality(Constructor(y),Variable(x)) => complicated(y, x)
}

我怀疑我必须像你的回答中描述的那样去做,但希望有一个简单的解决方案:无论如何,我更喜欢你的第二个想法,因为我希望编译器使用回溯,即如果有几十个其他case语句,则生成更有效的代码。