Могу ли я использовать параметры типа scala с val? - PullRequest
0 голосов
/ 29 февраля 2020

Я выполняю некоторые упражнения, чтобы привыкнуть к системе типов 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
      )
    )

Мой вопрос: возможно ли указать параметр типа для этого input val. Этот Список [Любой] в порядке, но я хочу как-то указать, что входной список имеет элементы того же типа, что и выходной Список. Примерно так (не работает кстати):

val inputs[SameType]: List[TestCase[(List[SameType], Int), List[SameType]]] = ...

Буду признателен за любые предложения. Может быть, параметры типа не предназначены для использования с vals?

Если вам интересно, почему я не просто утверждаю результаты: это потому, что у меня есть несколько реализаций одной и той же функции, и я не хочу повторить контрольные примеры для каждой реализации.

1 Ответ

3 голосов
/ 29 февраля 2020

Рассмотрим параметризацию вашей модели следующим образом:

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 для примеров обобщенных ограничений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...