【问题标题】:How to constraint maximum length of a list in an argument definition?如何限制参数定义中列表的最大长度?
【发布时间】:2012-01-02 04:41:33
【问题描述】:

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

【问题讨论】:

    标签: scala types collections


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-13
      • 2017-10-07
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多