强制严格征收

时间:2018-09-26 19:25:15

标签: scala

是否有使用Scala类型系统的简便方法,并且理想情况下没有运行时开销来执行严格的集合?我很喜欢类似下面的内容,但是仔细阅读Scala collections API我看不到任何这样的层次结构。我希望不必使用严格收集的白名单,但是如果那是唯一的方法,我会接受的。

case class Foo(xs: immutable.StrictSeq[Int])

1 个答案:

答案 0 :(得分:4)

Scala 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