加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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 _)
//                          ^

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读