【发布时间】:2019-04-16 00:33:46
【问题描述】:
我在 Scala 中有一个使用案例类构建的树数据结构(它属于 AST,但这与问题无关)。为了修改树,我使用了一个递归函数来破坏和重建整个树中的每个案例类:
def update(tree: Tree, id: String, val: Int): Tree = {
tree match {
case NodeType1(childs) =>
NodeType1(childs.map(update(_, id, val)))
case NodeType2(a, childs) =>
NodeType2(a, childs.map(update(_, id, val))
case NodeType3(a, b, childs) =>
NodeType3(a, b, childs.map(update(_, id, val))
...
case Leaf(`id`, oldVal) =>
Leaf(id, val)
}
}
树中的所有节点都只是“驱动通过”,除了具有正确 id 的 Leaf 节点,它已更新。我有大约 27 种不同的节点类型,所以匹配块变得非常大。
这种匹配代码能不能用更简洁的方式表达?我不在乎代码不会修改树,我只是希望它变得更短。
【问题讨论】:
标签: scala tree-traversal case-class