scala - 如何在参数定义中限制列表的最大长度?

标签 scala types collections

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

最佳答案

我认为您真的为此需要很多类型系统...这是依赖类型编程的经典任务,不幸的是 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))

关于scala - 如何在参数定义中限制列表的最大长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8198997/

相关文章:

Scala - 如何编译 "delay"表达式

scala - 使用自定义名称 Play WebSocketActor createHandler

excel - 如何正确使用 VBA 类模块集合?

java - play framework migrate to 2.1.1让我很头疼

haskell - 在 Haskell 中的约束内应用约束

dynamic - iOS 7 如何支持动态标签类型?

c++ - 在cygwin的makeing(编译)代码上,make命令告诉我我需要“ver”和“type”命令

java - 与手动搜索列表相比,Collections.binarySearch 的性能如何?

collections - 为什么在 Smalltalk 中将集合添加到自身会爆炸?

Scala:将@unchecked 注释放在foreach 中的位置