代码之家  ›  专栏  ›  技术社区  ›  Jack Koenig

强制严格集合

  •  3
  • Jack Koenig  · 技术社区  · 6 年前

    有没有一种简单的方法可以使用Scala类型的系统并且理想情况下没有运行时开销来强制执行严格的集合?我喜欢下面这样的东西,但是仔细阅读Scala集合API,我没有看到任何这样的层次结构。我不希望使用严格的收藏白名单,但如果这是唯一的办法,我会接受它。

    case class Foo(xs: immutable.StrictSeq[Int])
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Roberto Bonvallet    6 年前

    斯卡拉 Seq 他们没有捕捉到足够的信息来决定他们是否严格。

    您可以将要接受的序列列为白名单,如下所示:

    import scala.language.higherKinds
    
    // Tag for sequences that are strict.
    sealed trait StrictSeq[T[_] <: Seq[_]]
    
    object StrictSeq {
      // Evidence for the compiler that lists and vectors are strict.
      implicit object ListIsStrict   extends StrictSeq[List]
      implicit object VectorIsStrict extends StrictSeq[Vector]
    }
    
    // Restrict S to be a sequence and to have been tagged as strict.
    case class Foo[S[_] <: Seq[_] : StrictSeq](xs: S[Int])
    
    Foo(List(1, 2, 3))    // OK
    Foo(Vector(1, 2, 3))  // OK
    Foo(Stream(1, 2, 3))  // Compile-time error