1

下面是我试图用来说明模式匹配的代码:

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

}

如何测试每个模式?主方法中的 UnOp("-" , UnOp("-", e)) 行给出了一个错误:

not found: value e
4

1 回答 1

1

首先,将 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 表达式匹配的内容。

就个人而言,我喜欢认为案例类构造值而模式匹配解构它们。在使用模式匹配解构值的过程中,您还可以将片段绑定到变量。发生匹配后,您可以使用这些变量。

例如,在simplifyTopwill BinOp("+", e, Number(0))match when expris a BinOp 中,它的operator字段值为“+”,right字段值为“Number(0)”,该left字段可以有任何实例,Expr其值将绑定到变量e

另一个例子是case BinOp("+", Number(l), Number(r)) => Number(l+r),这种情况不仅会提取 - Scala 术语中的解构- BinOp 类型的外部值,还会提取其内部部分,即Numbers。

于 2012-10-24T01:58:11.197 回答