簡體   English   中英

如何約束參數定義中列表的最大長度?

[英]How to constraint maximum length of a list in an argument definition?

我的一個函數是從零到五個整數參數以及從零到五個字符串參數。 所以我認為它定義為2個列表的函數: f(numbers: List[Int], strings: List[String]) 但是我認為如果可能的話,限制長度是好的,因為IDE和/或編譯器可以強制執行它。 這可能嗎?

我認為你真的要求很多這種類型的系統...這是依賴類型編程的經典任務,不幸的是Scala不屬於這類。

你可以看看馬克哈拉的類型級自然

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM