簡體   English   中英

我可以使用帶有 val 的 Scala 類型參數嗎?

[英]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.

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