【发布时间】:2012-01-02 04:41:33
【问题描述】:
我的一个功能是从零到五个整数参数和从零到五个字符串参数。所以我认为它定义为 2 个列表的函数:f(numbers: List[Int], strings: List[String])。但是我认为如果可能的话,最好限制长度,因为 IDE 和/或编译器可以强制执行它。这可能吗?
【问题讨论】:
标签: scala types collections
我的一个功能是从零到五个整数参数和从零到五个字符串参数。所以我认为它定义为 2 个列表的函数:f(numbers: List[Int], strings: List[String])。但是我认为如果可能的话,最好限制长度,因为 IDE 和/或编译器可以强制执行它。这可能吗?
【问题讨论】:
标签: scala types collections
我认为您确实为此要求了很多类型系统...这是依赖类型编程的经典任务,不幸的是 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))
【讨论】: