通过解压缩列表[((A,B),(C,D))]或列表[(A,B,C,D)]进行变量多指派

vir*_*yes 3 scala tuples transform list

关于这个问题,我能够通过unzipa 进行多次分配List[(A,B)]

但是,现在我发现需要在a List[( (A,B),(C,D) )]或a 上进行多次分配List[(A,B,C,D)]

我看到有成对的解压缩和三胞胎的unzip3,但是如何对一对Tuple2OR 进行解构Tuple4以便进行多指派?我将相应调整下面的集合类型,但无论哪一个适用于一步多指派都可以.

// foo can be a List[(A,B,C,D)] OR List[( (A,B),(C,D) )]
val(a,b,c,d) = foo.unzip
Run Code Online (Sandbox Code Playgroud)

这有效,但被黑了

val(a,b,c_d) foo.unzip3 // foo is a List[(A,B,(C,D))]
Run Code Online (Sandbox Code Playgroud)

因为我不得不这样做,c_d._1而且c_d._2我试图通过多分配变量来避免这种情况

Tra*_*own 6

也许这是不言而喻的,但如果你不介意多个步骤,有一个简单的方法可以做到这一点:

val foo = List((1 -> "w", 'x -> 2.0), (101 -> "Y", 'Z -> 3.0))
val (p, q) = foo.unzip
val (a, b) = p.unzip
val (c, d) = p.unzip
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一个单行程序,你将不得不求助于像Scalaz这样的东西,它提供了一个Bifunctor允许你编写它的元组实例,例如:

 import scalaz._, Scalaz._

 val ((a, b), (c, d)) = foo.unzip.bimap(_.unzip, _.unzip)
Run Code Online (Sandbox Code Playgroud)

这与上面的版本基本相同,但bimap让我们在一行中完成所有工作.