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