簡體   English   中英

了解示例代碼的模式匹配

[英]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表達式匹配。

我個人認為案例類可以構造值,而模式匹配則可以解構它們。 在使用模式匹配解構值的過程中,您還可以將片段綁定到變量。 發生匹配后,您可以使用這些變量。

例如,在simplifyTopBinOp("+", 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM