Как ограничить максимальную длину списка в определении аргумента? - PullRequest
4 голосов
/ 20 ноября 2011

Моя функция - принимать от нуля до пяти целочисленных аргументов и от нуля до пяти строковых аргументов. Поэтому я считаю, что необходимо определить как функцию 2 списков: f(numbers: List[Int], strings: List[String]). Но я думаю, что хорошо ограничивать длину, если это возможно, поскольку IDE и / или компилятор может обеспечить это. Возможно ли это?

1 Ответ

7 голосов
/ 20 ноября 2011

Я думаю, вы действительно просите много системы типов для этой ... Это классическая задача для программирования с зависимой типизацией, к которому, к сожалению, категория Scala не относится.

Вы можете взглянуть на Натуральные персонажи Марка Харры :

type _0 = Nat0
type _1 = Succ[_0]
type _2 = Succ[_1]
// ...

Но если вы пойдете по этому пути, вам придется строить все свои списки таким образом, чтобы тип длины был очевиден для компилятора. Это означает, что нет рекурсии, нет неограниченных циклов и т. Д. Также вам придется придумать способ кодирования «<» в системе типов ... поскольку вы не можете делать рекурсию, я не уверен, как вы сделай это. Так что, наверное, не стоит. </p>

Может быть, другой способ решения этой проблемы - выяснить, откуда взялась цифра 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...