[英]Can I use scala type parameters with a val?
我正在通過一些練習來習慣 Scala 的類型系統。 我有一個用於運行單元測試的輔助函數,我在其中指定函數的輸入和預期輸出。 在這種情況下,我正在測試的函數返回列表的前 n 個元素:
val inputs: List[TestCase[(List[Any], Int), List[Any]]] = List(
TestCase(
input = (List('a', 't', 'o'), 2),
output = List('a', 't')
),
TestCase(
input = (List("Vegetable", "Fruit"), 4),
output = List("Vegetable", "Fruit")
),
TestCase(
input = (List(3.14, 6.22, 9.5), -7),
output = Nil
)
)
我的問題是是否可以為此輸入val 指定類型參數。 List[Any] 沒問題,但我想以某種方式指定輸入列表與輸出列表具有相同類型的元素。 像這樣的東西(順便說一句,不起作用):
val inputs[SameType]: List[TestCase[(List[SameType], Int), List[SameType]]] = ...
我很感激任何建議。 也許類型參數不打算與 vals 一起使用?
如果您想知道為什么我不只是斷言結果:這是因為我有同一個函數的多個實現,我不想為每個實現重復測試用例。
考慮像這樣參數化你的模型
case class TestCase[T](input: (List[T], Int), output: List[T])
所以現在我們可以定義,比如說,
val inputs: List[TestCase[String]] = ???
在 Scala 2 中,值定義不能參數化,但方法定義可以,例如
def input[T](x: List[TestCase[T]]) = ???
然而 Scala 3 可能會改變它,所以我們可以寫
val input = [T] => (x: List[TestCase[T]]) => ???
另一種方法是使用廣義約束,例如,
def assertEquals[A, B](input: List[A], output: List[B])(implicit ev: A =:= B) = ???
assertEquals(List(1), List("")) // error: Error: Cannot prove that Int =:= String
考慮munit作為廣義約束的例子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.