在Scala中废弃你的Boilerplate等价物?

时间:2012-05-02 23:56:25

标签: scala haskell

Haskell有这个很酷的通用遍历,可以让你在集合中的每个节点上调用map之类的东西,无论是自下而上还是自上而下。它被称为everywhere,您可以执行everywhere f tree之类的操作,并在树中的每个节点上调用f

在Scala中为Traversable编写等效的东西很容易,但Haskell也适用于元组和等价的案例类,或者更一般地说,是Scala调用Product的东西。

您可以使用Product方法遍历productIterator中的元素,但是一旦您知道构造函数的参数,有一些简单的方法可以将元组或案例类重新组合在一起(实际上,我想apply方法)应该是?

def mapOnProduct[X](f: X -> X, prod: Product) {
  val newArgs = prod.productIterator.map {
    case x: X => f(x)
    case id => id
  }.toList
  [?].apply(newArgs: _*)
}

我可以用[?]代替什么,以便有机会工作?

谢谢!

1 个答案:

答案 0 :(得分:6)

见Miles Sabin的无形Shapeless。在sybclass test

中有一个使用的例子