Я думаю, вы действительно просите много системы типов для этой ... Это классическая задача для программирования с зависимой типизацией, к которому, к сожалению, категория Scala не относится.
Вы можете взглянуть на Натуральные персонажи Марка Харры :
type _0 = Nat0
type _1 = Succ[_0]
type _2 = Succ[_1]
// ...
Но если вы пойдете по этому пути, вам придется строить все свои списки таким образом, чтобы тип длины был очевиден для компилятора. Это означает, что нет рекурсии, нет неограниченных циклов и т. Д. Также вам придется придумать способ кодирования «<» в системе типов ... поскольку вы не можете делать рекурсию, я не уверен, как вы сделай это. Так что, наверное, не стоит. </p>
Может быть, другой способ решения этой проблемы - выяснить, откуда взялась цифра 0..5, и ограничить некоторый другой тип на основе этой информации?
В качестве последнего средства вы можете определить особые случаи для допустимых размеров, разделенные так, чтобы у вас не было 25 случаев:
case class Small[+X](l: List[X])
def small(): Small[Nothing] = Small(List())
def small[A](a: A): Small[A] = Small(List(a))
def small[A](a1: A, a2: A): Small[A] = Small(List(a1,a2))