首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用示例代码理解模式匹配

使用示例代码理解模式匹配
EN

Stack Overflow用户
提问于 2012-10-24 05:53:21
回答 1查看 246关注 0票数 1

下面是我尝试用来说明模式匹配的代码:

代码语言:javascript
复制
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))给出一个错误:

代码语言:javascript
复制
not found: value e
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-24 09:58:11

首先,将main方法替换为以下方法:

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

它可能会打印类似Number(0)的内容,这与第一个case表达式相匹配。

就我个人而言,我倾向于认为case类构造值,而模式匹配解构它们。在这个使用patter match解构数值的过程中,您还可以将这些片段绑定到变量。在发生匹配之后,您可以使用这些变量。

例如,在simplifyTop中,当expr为BinOp,其operator字段的值为"+“,right字段的值为"Number(0)”时,Expr将匹配,left字段可以具有Expr的任何实例,其值将绑定到变量e

另一个例子是case BinOp("+", Number(l), Number(r)) => Number(l+r),这个例子不仅提取了BinOp类型的外部值,也提取了它的内部部分,也就是Number

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13039911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档