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

У 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: _*)
}

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

Спасибо!

7 голосов | спросил TOB 3 Mayam12 2012, 03:56:25

1 ответ


0

См. «Shapeless» Майлза Сабина Shapeless . Пример использования везде есть в тест sybclass

ответил Arjan Blokzijl 3 Mayam12 2012, 09:09:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132