7

mapHaskell には、ボトムアップまたはトップダウンのいずれかで、コレクション内のすべてのノードでのようなものを呼び出すことができる、このクールで一般的なトラバーサル機能があります。それが呼び出され、次のeverywhereようなことを行いeverywhere f treefツリー内のすべてのノードで呼び出されます。

Scala で for と同等のものを書くのTraversableは簡単ですが、Haskell のものはタプルや case クラスと同等のもの、またはより一般的には Scala が s と呼ぶものでも機能します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: _*)
}

これが機能する可能性があるように、何に置き換えることができ[?]ますか?

ありがとう!

4

1 に答える 1

6

Miles Sabin の Shapeless Shapelessを参照してください。sybclass テストのどこでも使用例があります

于 2012-05-03T05:09:18.807 に答える