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,其中内部的一个是第二个参数,你试图传递一个未定义的变量。