关于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._1c_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,我们可以在一行中完成所有操作。

09-30 08:54