Это можно сделать с помощью 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))