3

这是关于如何使用Shapeless库中的 SYB 实现在 Scala 中实现通用转换器的后续问题。

我想借助everywhereShapeless 中定义的组合器在 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
}

此函数应替换给定表达式中出现的每个xwith 。不幸的是,这个功能不能如我所愿。应用于值yexprgenericReplacetree

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 组合器?

4

0 回答 0