Scala 用示例代码理解模式匹配

Scala 用示例代码理解模式匹配,scala,Scala,下面是我试图用来说明模式匹配的代码: 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

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

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)) 在main中,方法给出了一个错误:

not found: value e

首先,将主要方法替换为以下方法:

def main(args: Array[String]) {
  val sample = UnOp("-" , UnOp("-", Number(0)) // no more undefined variable
  val simplified = simplifyTop(sample)
  println(simplified)
}
它可能会打印类似于
Number(0)
的内容,这与第一个大小写表达式相匹配

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

例如,在
simplifyTop
中,
BinOp(“+”,e,Number(0))
将匹配
expr
是一个BinOp时,其
操作符
字段的值为“+”,而
right
字段的值为“Number(0)”,
left
字段可以有
Expr
的任何实例,其值将绑定到变量
e


另一个例子是
case-BinOp(“+”,Number(l),Number(r))=>Number(l+r)
,这个例子不仅提取了-Scala行话中的解构-BinOp类型的外部值,还提取了它的内部部分,即
Number
s

首先,将主要方法替换为以下方法:

def main(args: Array[String]) {
  val sample = UnOp("-" , UnOp("-", Number(0)) // no more undefined variable
  val simplified = simplifyTop(sample)
  println(simplified)
}
它可能会打印类似于
Number(0)
的内容,这与第一个大小写表达式相匹配

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

例如,在
simplifyTop
中,
BinOp(“+”,e,Number(0))
将匹配
expr
是一个BinOp时,其
操作符
字段的值为“+”,而
right
字段的值为“Number(0)”,
left
字段可以有
Expr
的任何实例,其值将绑定到变量
e


另一个例子是
case-BinOp(“+”,Number(l),Number(r))=>Number(l+r)
,这个例子不仅提取了-Scala行话中的解构-BinOp类型的外部值,还提取了它的内部部分,即
Number
s

UnOp(“-”,UnOp(“-”,Var(“foo”))
main,no?@om nom nom谢谢,请您解释一下模式匹配在上述上下文中是如何工作的。我还是不明白。在main方法中,您正在构造两个嵌套的UnOp,其中内部的一个是第二个参数,您试图传递一个未定义的变量。
UnOp(“-”,UnOp(“-”,Var(“,”foo”)
在main中,否?@om nom nom谢谢,您介意解释一下模式匹配在上述上下文中是如何工作的吗。我还是不明白。在main方法中,你正在构造两个嵌套的UnOp,其中内部的一个是第二个参数,你试图传递一个未定义的变量。