2013-05-07 48 views
1

我试图实现一个等价关系的条款,我也想匹配一些模式。然而,我的关系是对称的,因此,模式匹配也必须反映这一点。与变量绑定匹配的替代模式?

看一看下面的例子:

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 ;-)" 
} 

然而,正如例如注意在here,这是不允许的。有人对这类问题有一个很好的解决方案吗?任何帮助/指针非常感谢。

回答

0

你可以创建自己的不应用方法是这样的:

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" 
} 

最简单的方法是为something rather complicated创建方法:

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) 
} 
+0

我怀疑我必须像你的答案中描述的那样做,但希望有一个简单的解决方案:D无论如何,我更喜欢你的第二个想法更多b因为我希望编译器能够使用后向追踪,即如果有其他几十个其他案例语句,就会产生更高效的代码。 – 2013-05-12 07:29:06