Ситуация:
Поток (RxScala) событий, которые мы группируем с помощью tumblingBuffer(), а затем строим полную историю для отладки. В конечном итоге я хочу, чтобы они были в (Seq[T], Seq[T]) всех значений, поэтому я создал следующую функцию в качестве аккумулятора для foldLeft:
def tupleConcat[S](a: (Seq[S], Seq[S]), b: (Seq[S], Seq[S])) = (a._1 ++ b._1, a._2 ++ b._2)
Теперь это вызвало у меня кучу предупреждений после прочтения книги Рунара и Пола «Функциональное программирование в Scala», так как это очень похоже на map2 двух экземпляров моноида, но я все еще немного застрял в том, как правильно его обобщить. . Пока я думаю, что это может выглядеть примерно так:
def tupleConcatSG[S](a: (S,S), b: (S,S))(implicit s: Semigroup[S]) = (a._1 |+| b._1, a._2 |+| b._2)
(но мне пришлось бы повысить свой Seq до IndexedSeq из того, что я могу собрать).
Чтобы обобщить дальше на любой Applicative, я думаю, мне понадобится экземпляр для кортежей, который, возможно, исходит от Shapeless? Или я упускаю что-то очевидное?
РЕДАКТИРОВАТЬ: я также должен добавить, что я пытаюсь избежать архивирования и распаковывания, основываясь на предвзятых соображениях производительности, но, возможно, мне не следует беспокоиться об этом... (каждая ценность tumblingBuffer (Seq,Seq) будет иметь длину ~ 15 000, и окончательный (Seq,Seq) должен быть в миллионах).