我難以使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 [_]]'。 –