gpt4 book ai didi

scala - Scala 中成对的惯用扁平化

转载 作者:行者123 更新时间:2023-12-04 23:54:35 25 4
gpt4 key购买 nike

我有一个函数将 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,但我不知道如何将它们应用于这对。

最佳答案

shapeless 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, 2, 3, 4, 5, 101, 102, 103),List('a, 'b, 'c, 'd, 'e, '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 - Scala 中成对的惯用扁平化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18873542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com