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

TOB*_*TOB 7 haskell scala

Haskell有这个很酷的通用遍历,可以让你map在集合中的每个节点上调用类似的东西,无论是自下而上还是自上而下.它被调用everywhere,你会做类似的事情,everywhere f tree并且f会在树中的每个节点上调用.

在Scala中编写等效的东西Traversable很简单,但Haskell也可以在元组和等效的case类上工作,或者更通用的是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: _*)
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Arj*_*ijl 6

见Miles Sabin的无形无形.在sybclass测试中有一个使用的例子