Scala中对的惯用扁平化

前端之家收集整理的这篇文章主要介绍了Scala中对的惯用扁平化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个函数将类型A的值映射到一对(Seq [B],Seq [C]).我想将函数应用于A的序列,并返回一对展平的Seq [B]和Seq [C].这是代码片段:

val a: Seq[A] 
val mapped: Seq[(Seq[B],Seq[C])] = a.map(f)

val (b,c) = mapped.unzip
val bc: (Seq[B],Seq[C]) = (b.flatten,c.flatten)

解决方案是可以接受的,但是有更惯用的方法吗?我虽然关于for-comprehensions或flatMaps,但我看不出如何将它们应用于这对.

解决方法

无形2.0.0-M1 is available,所以你可以 map on tuples

import shapeless._,Syntax.std.tuple._,poly._

val l = Seq(Seq(1,2,3,4,5) -> Seq('a,'b,'c),Seq(101,102,103) -> Seq('d,'e,'f))

type SS[T] = Seq[Seq[T]]
object flatten extends (SS ~> Seq) {
  def apply[T](ss: SS[T]) = ss.flatten
}

l.unzip.map(flatten) // l.unzip.hlisted.map(flatten).tupled for older versions of shapeless
// (Seq[Int],Seq[Symbol]) = (List(1,5,101,103),List('a,'c,'d,'f))

实际上应该可以自动convert多态方法转换为多态函数,但是这段代码不起作用:

def flatten[T](s: Seq[Seq[T]]) = s.flatten
l.unzip.map(flatten _)
//<console>:31: error: type mismatch;
// found   : Seq[T]
// required: Seq[Seq[T]]
//              l.unzip.map(flatten _)
//                          ^

猜你在找的Scala相关文章