Есть ли хороший способ объединить два n-кортежа? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть 2 n-кортежа, и мне нужно объединить их значения в качестве параметров для функции foo. В настоящее время я использовал Array для сохранения объединенных значений, что делает вызов функции глупым. Интересно, есть ли хороший способ объединить 2 n-кортежа, например, сохранить результат в новый n-кортеж (тогда я смогу вызвать функцию, такую ​​как foo.tupled(mergedT)).

def foo(p1: T, p2: T, p3: T, p4: T) = { ... }
val T1 = ... // a 8-tuple
val T2 = ... // a 8-tuple
def mergeValue[T](x: T, y: T): T = { ... }

val mv = T1.productIterator.zip(T2.productIterator).map(pair => mergeValue(pair._1, pair._2)).toArray
foo(mv(0), mv(1), mv(2), mv(3), mv(4), mv(5), mv(6), mv(7))

1 Ответ

1 голос
/ 31 октября 2019

Это можно сделать с помощью Shapeless.

Попробуйте

type T = String
def foo(p1: T, p2: T, p3: T, p4: T, p5: T, p6: T, p7: T, p8: T) = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8
val T1 = ("0", "1", "2", "3", "4", "5", "6", "7")
val T2 = ("a", "b", "c", "d", "e", "f", "g", "h")

def mergeValue[T](x: T, y: T): T = ???

import shapeless.poly.->, shapeless.syntax.std.tuple._

object p extends ((T, T) -> T)((mergeValue[T] _).tupled)

(foo _).tupled(T1.zip(T2).map(p))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...