これは、 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 コンビネータを正しく使用するにはどうすればよいですか?