Scala中对的惯用扁平化
发布时间:2020-12-16 18:04:24 所属栏目:安全 来源:网络整理
导读:我有一个函数将类型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.unzipval bc: (Seq[B],Seq[C]) = (b.flatte
我有一个函数将类型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 _) // ^ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |