scala - 在 Scala 中展平任意嵌套集合的通用、类型安全的方法?

标签 scala scala-collections

有时我会花一些时间来使用 Scala,尽管我无法在自己的工作中使用它(到目前为止),但它的功能组合对我很有吸引力。对于踢球,我决定尝试前几个 99 Haskell Problems以最通用的方式——操作并返回任何类型的适用集合。前几道题并不太难,但我发现自己完全被 flatten 搞糊涂了。 .我就是不知道如何输入这样的东西。

具体说一下我的问题:是否可以编写一个类型安全的函数来展平任意嵌套的 SeqLike ?所以说,

flatten(List(Array(List(1, 2, 3), List(4, 5, 6)), Array(List(7, 8, 9), List(10, 11, 12))))

会回来
List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12): List[Int]

?请注意,这与 Haskell 和 Scala 问题集中的问题并不完全相同;我正在尝试编写一个函数,它不是扁平化异构列表,而是扁平化同类但嵌套的序列。

在网上搜索我发现了一个 translation into Scala那个问题,但它运行并返回一个 List[Any]。我是否正确地认为这需要某种类型的递归?还是我说这比它更难?

最佳答案

以下适用于 Scala 2.10.0-M7。您需要为 Array 添加额外的案例。支持,也许可以改进它以具有更具体的输出集合类型,但我想这一切都可以从这里开始:

sealed trait InnerMost {
  implicit def innerSeq[A]: CanFlatten[Seq[A]] { type Elem = A } =
    new CanFlatten[Seq[A]] {
      type Elem = A
      def flatten(seq: Seq[A]): Seq[A] = seq
    }
}
object CanFlatten extends InnerMost {
  implicit def nestedSeq[A](implicit inner: CanFlatten[A]) 
  : CanFlatten[Seq[A]] { type Elem = inner.Elem } =
    new CanFlatten[Seq[A]] {
      type Elem = inner.Elem
      def flatten(seq: Seq[A]): Seq[inner.Elem] =
        seq.flatMap(a => inner.flatten(a))
    }
}
sealed trait CanFlatten[-A] {
  type Elem
  def flatten(seq: A): Seq[Elem]
}

implicit final class FlattenOp[A](val seq: A)(implicit val can: CanFlatten[A]) {
  def flattenAll: Seq[can.Elem] = can.flatten(seq)
}

// test        
assert(List(1, 2, 3).flattenAll == Seq(1, 2, 3))
assert(List(Seq(List(1, 2, 3), List(4, 5, 6)), Seq(List(7, 8, 9),
                List(10, 11, 12))).flattenAll == (1 to 12).toSeq)

关于scala - 在 Scala 中展平任意嵌套集合的通用、类型安全的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12160596/

相关文章:

scala - val 或 object 表示不可变的最终单例对象

java - 如何打开“玩”! Intellij IDEA 2.0 控制台?

scala - Scala组合器演算数据模型的类型推断

scala - 从本地构建的可变映射返回不可变映射的首选方法是什么?

Scalastyle bool 表达式可以简化

scala - 使用具有常量值的 var 在 Spark DataFrame 中创建新列

scala - 为什么 Scala 的 Traversable 有两个类型略有不同的 copyToArray 方法?

scala - 模式匹配空 ArrayBuffer

scala - 使用Scala打印列表中的第一个元素

scala - 物化可观察对象上的模式匹配图