下面是我尝试用来说明模式匹配的代码:
package patternmatching
object patterntest {
abstract class Expr
case class Var(name: String) extends Expr
case class Number(num: Double) extends Expr
case class UnOp(operator: String , arg: Expr) extends Expr
case class BinOp(operator: String, left: Expr, right: Expr) extends Expr
def simplifyTop(expr: Expr): Expr = expr match {
case UnOp("-", UnOp("-", e)) => e //double negation
case BinOp("+", e, Number(0)) => e //adding zero
case BinOp("*", e, Number(1)) => e //Mutiplying by one
case _ => expr
}
def main(args: Array[String]) {
UnOp("-" , UnOp("-", e))
}
}如何测试每个模式?main方法中的行UnOp("-",UnOp("-“,e))给出一个错误:
not found: value e发布于 2012-10-24 09:58:11
首先,将main方法替换为以下方法:
def main(args: Array[String]) {
val sample = UnOp("-" , UnOp("-", Number(0)) // no more undefined variable
val simplified = simplifyTop(sample)
println(simplified)
}它可能会打印类似Number(0)的内容,这与第一个case表达式相匹配。
就我个人而言,我倾向于认为case类构造值,而模式匹配解构它们。在这个使用patter match解构数值的过程中,您还可以将这些片段绑定到变量。在发生匹配之后,您可以使用这些变量。
例如,在simplifyTop中,当expr为BinOp,其operator字段的值为"+“,right字段的值为"Number(0)”时,Expr将匹配,left字段可以具有Expr的任何实例,其值将绑定到变量e。
另一个例子是case BinOp("+", Number(l), Number(r)) => Number(l+r),这个例子不仅提取了BinOp类型的外部值,也提取了它的内部部分,也就是Number。
https://stackoverflow.com/questions/13039911
复制相似问题