是否有使用Scala类型系统的简便方法,并且理想情况下没有运行时开销来执行严格的集合?我很喜欢类似下面的内容,但是仔细阅读Scala collections API我看不到任何这样的层次结构。我希望不必使用严格收集的白名单,但是如果那是唯一的方法,我会接受的。
case class Foo(xs: immutable.StrictSeq[Int])
答案 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