如何修复此通用scala方法以不需要显式类型参数?

时间:2013-05-22 15:43:03

标签: scala type-inference

在我正在进行的项目中,我经常发现自己将List [(A,List [B])]转换为List [(A,B)],其中A中的每个a与B中的每个b配对在它的相应对中。

我已经编写了以下Scala方法来实现这一目标。

object Loop {
  def unroll[A, S <: Seq[B], B](in: Seq[(A, S)]) : Seq[(A, B)] =
    in.flatMap(inPair => inPair._2.map(c => inPair._1 -> c))
}

当我尝试直观地使用它时

Loop.unroll(List[Pair[Int, List[String]]](1->List("1", "2")))

我得到一个编译器参数说明

推断类型参数[Int,List [String],Nothing]不符合方法unroll的类型参数bounds [A,S&lt;:Seq [B],B]。

我可以通过参数化展开为

来解决这个问题
unroll[Int, List[String], String](...)

然而在美学上我觉得第3个字符串参数是多余的。如果可能的话,我怎样才能将其重写为不需要第3个类型参数或允许scala的类型推理猜测它? 我正在使用scala 2.9.3。

1 个答案:

答案 0 :(得分:1)

试试这个:

  def unroll2[A, B](in: Seq[Pair[A, Seq[B]]]): Seq[(A, B)] = {
    in.flatMap(pair => pair._2.map(v => pair._1 -> v))
  }

  val unrolled: Seq[(Int, String)] = unroll2(List(1 -> List("A", "B")))

另外,为了减少类型的复杂性,我考虑使用Map[A, Seq[B]]