是否可以通用地替换案例类中的参数?更具体地说,假设我想要一个接收“查找”案例类和“替换”案例类(如语法规则的左侧和右侧)以及目标案例类的替代函数,并且该函数将返回将查找案例类的参数替换为替换案例类的新案例类?该函数还可以简单地采用一个案例类(产品?)和一个应用于该案例类的所有参数/产品的函数。
显然,给定一个特定的案例类,我可以使用 unapply 和 apply - 但是一般(给定任何案例类)编写此类函数的最佳/最简单/等方法是什么?
我想知道是否有一个使用 Scala 2.10 反射功能或来自 shapeless 的 Iso.hlist 的好的解决方案。
例如,我真正想要做的是,给定如下所示的类......
class Op[T]
case class From(x:Op[Int]) extends Op[Int]
case class To(x:Op[Int]) extends Op[Int]
case class Target(a:Op[Int], b:Op[Int]) extends ...
// and lots of other similar case classes
...有一个函数,可以接受任意 case 类并返回它的副本,并将 From 类型的任何元素替换为 To 类型的实例。
如果您原谅这个插件,我想您会发现我们的重写组件Kiama 语言处理库 http://kiama.googlecode.com非常适合这种目的。它提供了一种非常强大的战略规划形式。
这是重写的完整解决方案To
's to From
位于由案例类实例组成的树中。
import org.kiama.rewriting.Rewriter
class Op[T]
case class Leaf (i : Int) extends Op[Int]
case class From (x : Op[Int]) extends Op[Int]
case class To (x : Op[Int]) extends Op[Int]
case class Target1 (a : Op[Int], b : Op[Int]) extends Op[Int]
case class Target2 (c : Op[Int]) extends Op[Int]
object Main extends Rewriter {
def main (args : Array[String]) {
val replaceFromsWithTos =
everywhere {
rule {
case From (x) => To (x)
}
}
val t1 = Target1 (From (Leaf (1)), To (Leaf (2)))
val t2 = Target2 (Target1 (From (Leaf (3)), Target2 (From (Leaf (4)))))
println (rewrite (replaceFromsWithTos) (t1))
println (rewrite (replaceFromsWithTos) (t2))
}
}
输出是
Target1(To(Leaf(1)),To(Leaf(2)))
Target2(Target1(To(Leaf(3)),Target2(To(Leaf(4)))))
的想法replaceFromsWithTos
值是rule
构造提升了一个偏函数,使其能够对任何类型的值进行操作。在这种情况下,偏函数仅定义在From
节点,将它们替换为To
节点。这everywhere
组合器说“将我的参数应用于树中的所有节点,保留参数不适用的位置不变。
除了这种简单的重写之外,我们还可以做更多的事情。看主要的 Kiama 重写文档 https://code.google.com/p/kiama/wiki/Rewriting了解血淋淋的细节,包括更多示例的链接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)