这是关于如何使用followup question库中的SYB实现在Scala中实现通用转换器的Shapeless。
我希望借助Shapeless中定义的everywhere
组合子在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
中y
的{{1}}的每一次出现。
不幸的是,这个功能不能像我想的那样工作。将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)
组合器?