Scala 强制执行严格的集合

Scala 强制执行严格的集合,scala,Scala,有没有一种简单的方法可以使用Scala类型系统,理想情况下不需要运行时开销来强制执行严格的集合?我喜欢下面这样的东西,但仔细阅读Scala collections API,我没有看到任何这样的层次结构。我宁愿不使用严格收藏的白名单,但如果这是唯一的方法,我会接受它 case class Foo(xs: immutable.StrictSeq[Int]) ScalaSeqs没有捕获足够的信息来决定它们是否严格 您可以将要接受的序列列为白名单,如下所示: import scala.language

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

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

Scala
Seq
s没有捕获足够的信息来决定它们是否严格

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

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
导入scala.language.higherKinds
//用于严格的序列的标记。

seq[T[u1;]您试图解决的更大的问题是什么?通常,如果我担心调用方对存储集合进行变异,我只需在内部创建一个不可变的集合副本并使用它。问题是,我在一个关键公共API中有一个树结构,其中有几个seq。人们用来从中提取信息的常见模式是递归遍历结构和填充可变的数据结构。如果你不小心在树中插入了一个懒惰的集合,事情就不会发生了。这种模式是有问题的,但很常用,所以我的目标是找到一种方法来帮助防止人们射中自己的脚。