scala - 列表中的案例类和模式匹配

标签 scala pattern-matching

我想做的是简化这个表达式

Opt(Opt (ExpList(List( Opt(Opt (Var("optional")))))))

得到这样的东西

选项 (ExpList(List( Opt (Var("optional")))))

为了简化列表中的所有表达式,匹配表达式会是什么样子。

此类任务的最佳实践是什么?

我试过的代码片段是这样的:

object CaseClassPatternMatching extends App {
  abstract class Expr
  case class Var(name: String) extends Expr
  case class Opt(expr: Expr) extends Expr
  case class ExpList(listExp: List[Expr]) extends Expr

  def joinOpt(feature: Expr): Expr = feature match {
    case Opt(Opt(f)) => joinOpt(Opt(f))    // Opt(Opt("test")) --> Opt("test")
    // case ExpList(list) => ????          // What to do there?
    case _ => feature
  }

  val expr1: Expr = joinOpt(Opt(Opt(Opt(Var("optional")))))
  println(Opt(Var("optional"))) 
  // Output: Opt(Var(optional))  --> That one is OK...

  val expr2: Expr = joinOpt(Opt(Opt(ExpList(List(Opt(Opt(Var("optional"))))))))
  println(expr2)
  // Output: Opt(ExpList(List(Opt(Opt(Var(optional))))))  --> Not OK...
  // How to simplify expressions inside list?
}

[编辑]

对于那些有兴趣的人,类似的话题:

Scala case classes, pattern matching and varargs

最佳答案

你需要四种情况:

def joinOpt(feature: Expr): Expr = feature match {
                         // remove extra Opt 
                         // (you can use @ to avoid recreating Opt)
  case Opt(opt @ Opt(_)) => joinOpt(opt) 
                         // preserve single Opt
  case Opt(expr)         => Opt(joinOpt(expr)) 
                         // apply function to all elements in inner list
  case ExpList(list)     => ExpList(list map joinOpt) 
  case _ => feature
}

关于scala - 列表中的案例类和模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186135/

相关文章:

haskell - 多态参数类型的模式匹配 - 备选方案

list - 添加两个不同大小列表的内容 haskell

scala - 如何使用scala查找字符串变量中的位数?

java - 如何使用模式匹配器仅获取与 Java 中的正则表达式匹配的第一行?

generics - 具有通配符类型参数的 Map 上的 flatMap

scala - 如何使用 Play 2.0 创建自定义 404 页面处理程序?

linux - 回显所有匹配模式的文件

java - 正则表达式替换重复的字符串模式

scala - 可以对 scala dsl 进行编码以发出其自己的专门编译错误吗?

scala - 在 Scala 中使用反射访问外部类