[英]Understanding pattern matching with sample code
以下是我試圖用來說明模式匹配的代碼:
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
首先,將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表達式匹配。
我個人認為案例類可以構造值,而模式匹配則可以解構它們。 在使用模式匹配解構值的過程中,您還可以將片段綁定到變量。 發生匹配后,您可以使用這些變量。
例如,在simplifyTop
的BinOp("+", e, Number(0))
時將匹配expr
是BinOp,其operator
字段具有值“+”和right
領域已經值“號碼(0)”時, left
場可以具有Expr
任何實例,並且其值將綁定到變量e
。
另一個例子是case BinOp("+", Number(l), Number(r)) => Number(l+r)
情況,這種情況不僅會提取-Scala行話中的解構方法 -BinOp類型的外部值還有其內部,即Number
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.