如何约束参数定义中列表的最大长度?

Iva*_*van 4 collections types scala

我的一个函数是从零到五个整数参数以及从零到五个字符串参数.所以我认为它定义为2个列表的函数:f(numbers: List[Int], strings: List[String]).但是我认为如果可能的话,限制长度是好的,因为IDE和/或编译器可以强制执行它.这可能吗?

Owe*_*wen 7

我认为你真的要求很多这种类型的系统...这是依赖类型编程的经典任务,不幸的是Scala不属于这类.

你可以看看马克哈拉的类型级自然:

type _0 = Nat0
type _1 = Succ[_0]
type _2 = Succ[_1]
// ...
Run Code Online (Sandbox Code Playgroud)

但是如果沿着这条路走下去,你将不得不以这样的方式构建所有列表,使得编码器的长度类型很明显.这意味着没有递归,没有无限循环等.此外,你必须想出一种在类型系统中编码"<"的方法...因为你不能做递归我不知道你是怎么做的去做.所以,可能不值得.

也许解决这个问题的另一种方法是弄清楚'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))
Run Code Online (Sandbox Code Playgroud)