1

在我正在进行的一个项目中,我经常发现自己将 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] 不符合方法展开的类型参数边界 [A, S<: Seq[B],B]。

我可以通过参数化展开来解决这个问题

unroll[Int, List[String], String](...)

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

4

1 回答 1

2

尝试这个:

  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]]

于 2013-05-22T15:53:06.083 回答