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我试图通过多分配变量来避免这种情况
也许这是不言而喻的,但如果你不介意多个步骤,有一个简单的方法可以做到这一点:
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让我们在一行中完成所有工作.