这是关于如何使用Shapeless库中的 SYB 实现在 Scala 中实现通用转换器的后续问题。
我想借助everywhere
Shapeless 中定义的组合器在 Scala 中定义一个通用的“替换”函数:
def genericReplace[A, B](x: A, y: A, expr: B) = {
object replace extends ->((a: A) => if (a == x) y else a)
def transform(implicit e: Everywhere[replace.type, B]) = e(expr)
transform
}
此函数应替换给定表达式中出现的每个x
with 。不幸的是,这个功能不能如我所愿。应用于值y
expr
genericReplace
tree
sealed trait Tree[T]
case class Leaf[T](t: T) extends Tree[T]
case class Node[T](left: Tree[T], right: Tree[T]) extends Tree[T]
val tree: Tree[Int] = Node(Node(Leaf(1), Node(Leaf(2), Leaf(3))), Leaf(4))
val result = genericReplace(1, 100, tree)
根本不会改变给定的值。
有没有办法让这个例子工作?如何everywhere
在我的代码中正确使用 Shapeless 组合器?