Исходя из опыта C ++, я не понимаю, зачем нужны типы / выражения типов как первоклассный гражданин? Единственный язык, который я знаю, который поддерживает эту функцию, это Aldor.
Есть ли у кого-нибудь литература о типах как первоклассном гражданине или есть причины, почему это полезно?
Ответы:
Типы первого класса включают то, что называется зависимой типизацией . Это позволяет программисту использовать значения типов на уровне типов. Например, тип всех пар целых чисел является обычным типом, в то время как пара всех целых чисел с левым числом, меньшим, чем правое число, является зависимым типом. Стандартный вводный пример этого - списки с закодированной длиной (обычно называемые
Vector
в Haskell / Idris). Следующий псевдокод представляет собой смесь Идриса и Хаскелла.Этот фрагмент кода говорит нам о двух вещах:
cons
вставка элемента в список создает список длиныn + 1
Это выглядит очень похоже на другую концепцию с 0 и
n + 1
не так ли? Я вернусь к этому.Что мы получаем от этого? Теперь мы можем определить дополнительные свойства используемых нами функций. Например: Важным свойством
append
является то, что длина результирующего списка является суммой длин двух списков аргументов:Но в целом эта техника не кажется полезной в повседневном программировании. Как это относится к сокетам,
POST
/GET
запросам и так далее?Ну, это не так (по крайней мере, не без значительных усилий). Но это может помочь нам другими способами:
Зависимые типы позволяют нам формулировать инварианты в коде - правила о том, как должна вести себя функция. Используя их, мы получаем дополнительную безопасность в отношении поведения кода, аналогично предварительным и постусловиям Eiffel. Это чрезвычайно полезно для автоматического доказательства теорем, который является одним из возможных применений Idris.
Возвращаясь к приведенному выше примеру, определение списков с закодированной длиной напоминает математическую концепцию индукции . В Идрисе вы можете сформулировать концепцию индукции в таком списке следующим образом:
Этот метод ограничен конструктивными доказательствами, но, тем не менее, очень мощный. Вы можете попытаться написать
append
индуктивно в качестве упражнения.Конечно, зависимые типы - это только одно использование типов первого класса, но это, пожалуй, один из самых распространенных. Дополнительное использование включает, например, возврат определенного типа из функции на основе ее аргументов.
Это бессмысленный пример, но он демонстрирует то, что вы не можете подражать без первоклассных типов.
источник