What I would like to do is simplify this expression
Opt (Opt (ExpList (List ( Opt (Opt (Var ("option")))))))
to get something like this
Opt (ExpList (List ( Opt (Var ("option")))))
What will match the expression seems to simplify all the expressions inside the list.
What are the best practices for such tasks?
Missed code snippet:
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? }
[EDIT]
For those who are interested in you, a similar topic:
Scala case classes, pattern matching and varargs
source share