Утилизировать свой эквивалент Boilerplate в Scala?

В Haskell есть классный общий механизм обхода, который позволяет вам вызывать что-то вроде mapдля каждого узла в коллекции, снизу -вверх или вверх -. вниз. Он называется everywhere, и вы должны сделать что-то вроде everywhere f tree, а fбудет вызываться на каждом узле вашего дерева.

Написать что-то эквивалентное на Scala для Traversableнесложно, но Haskell также работает с кортежами и эквивалентными case-классами или, в более общем смысле, с тем, что Scala называет Products.

Вы можете перемещаться по элементам в Productс помощью метода productIterator, но есть ли какой-нибудь простой способ снова собрать кортеж или класс case, когда вы знаете, что на самом деле аргументы конструктора (?, наверное 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: _*)
}

Чем заменить [?], чтобы это работало?

Спасибо!

7
задан TOB 2 May 2012 в 23:56
поделиться