如何使用Shapeless结构编程在Scala中定义通用的“替换”函数?

时间:2013-11-13 14:07:55

标签: scala generic-programming shapeless

这是关于如何使用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
}

此函数应替换给定表达式xy的{​​{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) 组合器?

0 个答案:

没有答案