我难以使flatUnzip
的隐式需求正常工作。目前看起来第一个要求A
是Tuple2[CC1[T1], CC2[T2]]
被忽略(因此理智检查无法编译)。这里有什么建议?在回答时,也请解释我目前的尝试有什么问题。斯卡拉 - 列表元组列表的隐含证据
class MySeq[A](val _seq: Seq[A]) extends AnyVal {
def flatUnzip[T1, T2, CC1[T1], CC2[T2]](
implicit ev1: A =:= Tuple2[CC1[T1], CC2[T2]],
ev2: CC1[T1] <:< TraversableOnce[T1],
ev3: CC2[T2] <:< TraversableOnce[T2],
cbf1: CanBuildFrom[CC1[T1], T1, CC1[T1]],
cbf2: CanBuildFrom[CC2[T2], T2, CC2[T2]]
): (CC1[T1], CC2[T2]) = {
val foo: Seq[Tuple2[CC1[T1], CC2[T2]]] = _seq // sanity check fails
val list1 = cbf1()
val list2 = cbf2()
for ((xs, ys) <- _seq) {
list1 ++= xs
list2 ++= ys
}
return (list1.result, list2.result)
}
}
EDIT
我发现了以下工作,但只有当=:=
在方向上施加如图所示:
class MySeq[A](val _seq: Seq[A]) extends AnyVal {
def mapBy[B](func: A => B): Map[B, A] = _seq.map(x => (func(x), x)).toMap
def flatUnzip[T1, T2, CC1[T1], CC2[T2]](
implicit
ev1: Tuple2[CC1[T1], CC2[T2]] =:= A,
ev2: Seq[A] =:= Seq[Tuple2[CC1[T1], CC2[T2]]],
ev3: CC1[T1] <:< TraversableOnce[T1],
ev4: CC2[T2] <:< TraversableOnce[T2],
cbf1: CanBuildFrom[CC1[T1], T1, CC1[T1]],
cbf2: CanBuildFrom[CC2[T2], T2, CC2[T2]]
): (CC1[T1], CC2[T2]) = {
val list1 = cbf1()
val list2 = cbf2()
for ((xs, ys) <- _seq: Seq[Tuple2[CC1[T1], CC2[T2]]]) {
list1 ++= xs
list2 ++= ys
}
return (list1.result, list2.result)
}
}
然而,随着Seq[Tuple2[CC1[T1], CC2[T2]]] =:= Seq[A]
或Tuple2[CC1[T1], CC2[T2]] =:= A
与替换Seq[A] =:= Seq[Tuple2[CC1[T1], CC2[T2]]]
A =:= Tuple2[CC1[T1], CC2[T2]]
会导致问题。有人可以解释为什么这里的订单很重要,为什么需要这些A =:= B
关系中的每一个来完成这项工作?
nitpick:这里不需要'return' –
nitpick#2:'[T1,T2,CC1 [T1],CC2 [T2]]'并不意味着你的想法。你可以只写'[T1,T2,CC1 [_],CC2 [_]]'。 –