关于this question,我可以通过unzip
上的List[(A,B)]
进行多次分配
但是,现在我发现需要对List[( (A,B),(C,D) )]
或List[(A,B,C,D)]
进行多次分配
我看到对有一个解压缩,三胞胎有一个unzip3,但是如何解构一对Tuple2
或单个Tuple4
以便进行多次分配?我将在下面相应地修改集合类型,但是无论哪一种都能进行1步多任务分配都可以。
// foo can be a List[(A,B,C,D)] OR List[( (A,B),(C,D) )]
val(a,b,c,d) = foo.unzip
这可行,但是被黑了
val(a,b,c_d) foo.unzip3 // foo is a List[(A,B,(C,D))]
因为我最终不得不使用
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
如果您真的想要单线,则必须诉诸Scalaz之类的方法,它为元组提供
Bifunctor
实例,让您编写此代码,例如: import scalaz._, Scalaz._
val ((a, b), (c, d)) = foo.unzip.bimap(_.unzip, _.unzip)
这与上面的版本基本相同,但是有了
bimap
,我们可以在一行中完成所有操作。