列表上的案例类和模式匹配
我想做的是简化这个表达式
Opt(Opt(ExpList(List(Opt(Opt(Var("optional")))))))
得到类似的东西
Opt(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?
}
[编辑]
对于那些感兴趣的人,类似的主题:
What I would like to do is simplify this expression
Opt(Opt(ExpList(List(Opt(Opt(Var("optional")))))))
to get something like that
Opt(ExpList(List(Opt(Var("optional")))))
What would match expression look like in order to simplify all expressions inside the list.
What are best-practises for those kind of tasks?
The code snippet I tried is this:
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 of you who are interested, similar topic:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要四种情况:
You need four cases:
好吧,我会这样写
joinOpt
:Well, I'd write
joinOpt
like this: