函数可以接收带有不确定数目的参数的元组吗?

时间:2019-04-18 08:57:31

标签: scala

我有一个可以接收List [tuple3(foo,bar,fooby)]的函数,我意识到我想在使用List [tuple4(foo,bar,fooby,foobar)]时使用相同的函数。我想我可以对此使用模式匹配,但这会使代码重复。我该怎么办?

val tuple3List : List[(Foo, Bar, Fooby)] = List()
val tuple4List : List[(Foo, Bar, Fooby, Foobar)] = List()

myFunc(tuple3List)
myFunc(tuple4List)

def myFunc(tupleList : List[Foo, Bar, Fooby]) = {
}

2 个答案:

答案 0 :(得分:3)

Tuple3Product3的子类型,Tuple4Product4 ...的子类型

Product3Product4 ...是Product的子类型。

因此您可以尝试

val tuple3List : List[(Foo, Bar, Fooby)] = List()
val tuple4List : List[(Foo, Bar, Fooby, Foobar)] = List()

myFunc(tuple3List)
myFunc(tuple4List)

def myFunc(tupleList : List[Product]) = {
  // Do stuff
}

“具有不确定数目的元组的元组”的另一种替代方法可能是shapeless.HList

答案 1 :(得分:2)

您可以使用Product使其通用,但这会删除很多类型信息。由于类型擦除问题,您不能使用重载。

如果可能的话,最好使用类而不是元组,并使4元素版本成为3元素版本的子类:

trait myTrait { val a: Foo, val b: Bar, val c: Fooby }

case class Three(a: Foo, b: Bar, c: Fooby) extends myTrait
case class Four(a: Foo, b: Bar, c: Fooby, d: Foobar) extends myTrait

def myFunc(list: List[myTrait]) = ???

如果需要使用元组,可以使用 typeclass 来解决,但这是一个重量级的解决方案。