我可以在类型/编译级别强制 myArray.size == 3 吗?
是的,Scala 可以represent numbers at type-level。例如,使用 shapeless 中的Sized
import shapeless._
import syntax.sized._
import nat._
case class MyClass(myArray: Sized[Array[Int], _3])
MyClass(Sized[Array](1,2,3)) // ok
MyClass(Sized[Array](1,2,3,4)) // compile-time error
Array(1,2,3,4).sized(3).map(MyClass) // None
以下是在 Scala 3 中使用 scala.compiletime.ops 设施的方法
import scala.compiletime.ops.int.S
enum MyArray[Size, +A]:
case Nil extends MyArray[0, Nothing]
case Cons[N <: Int, B](head: B, tail: MyArray[N, B]) extends MyArray[S[N], B]
import MyArray._
val xs: MyArray[3, Int] = Cons(1, Cons(2, Cons(3, Nil)))
val ys: MyArray[4, Int] = Cons(1, Cons(2, Cons(3, Cons(4, Nil))))
case class MyClass(myArray: MyArray[3, Int])
MyClass(xs) // ok
MyClass(ys) // compile-time error