2012-10-23 73 views
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( 「 - 」,電子)) 的主要方法中提供了一個錯誤:

not found: value e 
+3

'UnOp(「 - 」,UnOp(「 - 」,Var(「foo」)))'in main,no? –

+0

@ om-nom-nom謝謝,你是否介意模式匹配在上述情況下如何工作。我仍然不明白。 – user701254

+1

在主要方法中,您構建了兩個嵌套的UnOp,其中內部的一個第二個參數試圖傳遞未定義的變量。 – pedrofurla

回答

1

首先,用下面的一個替換的主要方法:

def main(args: Array[String]) { 
    val sample = UnOp("-" , UnOp("-", Number(0)) // no more undefined variable 
    val simplified = simplifyTop(sample) 
    println(simplified) 
} 

它可能會打印類似Number(0)這是與第一個表達式匹配的內容。

就我個人而言,我喜歡認爲案例類構造值和模式匹配解構他們。在這個過程中,使用patter match解構值,您也可以將這些塊綁定到變量。匹配發生後,您可以使用這些變量。

例如,在simplifyTopBinOp("+", e, Number(0))將當expr是BinOp匹配,其operator字段具有值「+」和right字段具有值「號碼(0)」時,left字段可以具有Expr任何實例和它的值將被綁定到變量e

另一個例子是case BinOp("+", Number(l), Number(r)) => Number(l+r),這種情況下將不僅提取物 - 在解構 Scala中行話 - 型BinOp的外值,而且其內部部件,其是Number秒。