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))
    }

}

各パターンをテストするにはどうすればよいですか?mainメソッド内の行UnOp( "-"、UnOp( "-"、e))はエラーになります:

not found: value e
4

1 に答える 1

1

まず、mainメソッドを次のメソッドに置き換えます。

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

おそらくNumber(0)、最初のケースの式に一致するようなものが出力されます。

個人的には、casesクラスが値を構築し、パターンマッチがそれらを分解すると思います。パターン一致を使用して値を分解するこのプロセスでは、ピースを変数にバインドすることもできます。一致が発生した後、これらの変数を使用します。

たとえば、simplifyTopがBinOpのBinOp("+", e, Number(0))場合に一致する場合、そのフィールドの値は「+」、フィールドの値は「Number(0)」です。フィールドには任意のインスタンスを含めることができ、その値は変数にバインドされます。exproperatorrightleftExpre

別の例としてはcase BinOp("+", Number(l), Number(r)) => Number(l+r)、この場合は、タイプBinOpの外側の値だけでなく、その内側の部分であるsも抽出します(Scala専門用語での脱構築Number) 。

于 2012-10-24T01:58:11.197 に答える