2011-11-20 48 views
4

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

回答

7

我认为你真的在为这个问题寻求很多类型系统......这是一个依赖类型编程的经典任务,在这个类别中Scala不幸是不属于的。

你可以看看Mark Harrah's type-level Naturals

type _0 = Nat0 
type _1 = Succ[_0] 
type _2 = Succ[_1] 
// ... 

但是如果你沿着这条路走下去,你就必须建立所有的名单以这样的方式使长度型是显而易见的编译器。这意味着没有递归,没有无限循环,等等。你也必须想出一种方法来编码类型系统中的“<”...因为你不能做递归我不知道你怎么样去做。所以,可能不值得。

也许解决这个问题的另一种方法是找出'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))