В Haskell есть классный общий механизм обхода, который позволяет вам вызывать что-то вроде map
для каждого узла в коллекции, снизу -вверх или вверх -. вниз. Он называется everywhere
, и вы должны сделать что-то вроде everywhere f tree
, а f
будет вызываться на каждом узле вашего дерева.
Написать что-то эквивалентное на Scala для Traversable
несложно, но Haskell также работает с кортежами и эквивалентными case-классами или, в более общем смысле, с тем, что Scala называет Product
s.
Вы можете перемещаться по элементам в 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: _*)
}
Чем заменить [?]
, чтобы это работало?
Спасибо!