【发布时间】:2020-11-28 11:51:03
【问题描述】:
我试图在单个 case 子句中匹配所有二元运算符,但以下代码给出了错误:
object BinOp is not a case class, nor does it have a valid unapply/unapplySeq member
Note: def unapply(a: AST.this.Expr, b: AST.this.Expr): Option[(AST.this.Expr, AST.this.Expr)] exists in object BinOp, but it cannot be used as an extractor as it has more than one (non-implicit) parameter.
遍历树的核心代码:
tree match {
case ... other ... cases
case BinOp(a, b) => traverse(a), traverse(b)
}
AST类如下:
sealed trait Expr
case class Num(value: java.lang.Number) extends Expr
sealed trait BinOp extends Expr {
val a, b: Expr
}
object BinOp {
def unapply(a: Expr, b: Expr): Option[(Expr, Expr)] = Some(a, b)
}
case class Add(a: Expr, b: Expr) extends BinOp
case class Sub(a: Expr, b: Expr) extends BinOp
case class Mul(a: Expr, b: Expr) extends BinOp
case class Div(a: Expr, b: Expr) extends BinOp
为了便于说明,对代码段进行了极大的简化。
【问题讨论】:
-
我实际上是在寻找一个通用的解决方案来遍历包含另一个节点的任何节点;闻起来像 Applicative/Functor 或其他一些深奥的 Haskell 概念。任何“可遍历”节点都将被匹配,例如
-
viyps,如果您将该评论添加为问题的编辑会更好
-
您能否提供更多关于您将如何遍历这些节点的上下文?你只是想让它们可迭代还是什么?
标签: scala pattern-matching abstract-syntax-tree case-class