Хорошо, пойдем один за другим.
Ценности
Значения - это конкретные данные, которые программы оценивают и обрабатывают. Ничего особенного, некоторые примеры могут быть
1
true
"fizz buzz foo bar"
Типы
Хорошим описанием для типа является «классификатор для значения». Тип - это немного информации о том, что это значение будет во время выполнения, но оно будет указано во время компиляции.
Например , если вы скажете мне , что e : bool
во время компиляции, и я буду знать , что e
это либо true
или false
во время выполнения, ничего! Поскольку типы классифицируют значения следующим образом, мы можем использовать эту информацию для определения некоторых основных свойств вашей программы.
Например, если я когда-нибудь увижу, что вы добавляете e
и e'
когда e : int
и когда e' : String
, то я знаю, что что-то не так! На самом деле я могу пометить это и выдать ошибку во время компиляции, говоря: «Эй, это не имеет никакого смысла!».
Более мощная система типов допускает более интересные типы, которые классифицируют более интересные значения. Например, давайте рассмотрим некоторую функцию
f = fun x -> x
Это довольно ясно f : Something -> Something
, но что это должно Something
быть? В скучной системе типов мы должны были бы указать что-то произвольное, например Something = int
. В более гибкой системе типов мы могли бы сказать,
f : forall a. a -> a
То есть "для любого a
, f
карты и a
к a
". Это позволяет нам использовать f
более широко и писать более интересные программы.
Более того, компилятор будет проверять, действительно ли он соответствует заданному нами классификатору, если f = fun x -> true
тогда у нас будет ошибка, и компилятор скажет об этом!
Так как TLDR; тип - это ограничение времени компиляции для значений, которые могут быть выражены во время выполнения.
Тип Конструктор
Некоторые типы связаны между собой. Например, список целых чисел очень похож на список строк. Это почти как sort
для целых чисел, почти как sort
для строк. Мы можем представить себе своего рода фабрику, которая создает эти почти одинаковые типы, обобщая их различия и создавая их по требованию. Вот что такое конструктор типов. Это как функция от типов к типам, но немного более ограниченная.
Классическим примером является общий список. Конструктор типа для это просто общее определение
data List a = Cons a (List a) | Nil
Теперь List
это функция, которая отображает тип a
в список значений этого типа! В Java-земле я думаю, что их, возможно, называют «универсальными классами».
Параметры типа
Параметр типа - это просто тип, переданный конструктору типа (или функции). Точно так же, как в уровне значений, который мы бы сказали, foo(a)
есть параметр, a
так же как List a
и у параметра типа a
.
Виды
Виды немного сложнее. Основная идея заключается в том, что определенные типы похожи. Например, у нас есть все примитивные типы в Java int
, char
, float
... , которые все ведут себя так , как будто они имеют один и тот же «тип». Кроме того, когда мы говорим о классификаторах для самих типов, мы называем классификаторы видами. Итак int : Prim
, String : Box
, List : Boxed -> Boxed
.
Эта система дает хорошие конкретные правила о том, какие типы мы можем использовать, где, например, как типы управляют значениями. Было бы явно глупо сказать,
List<List>
или
List<int>
В Java, поскольку List
необходимо применять к конкретному типу, который будет использоваться таким образом! Если мы посмотрим на их виды List : Boxed -> Boxed
и с тех пор Boxed -> Boxed /= Boxed
, вышесказанное является доброй ошибкой!
Большую часть времени мы на самом деле не думаем о видах, а просто относимся к ним как к «здравому смыслу», но в случае систем с причудливыми типами это важно учитывать.
Небольшая иллюстрация того, что я говорил до сих пор
value : type : kind : ...
true : bool : Prim : ...
new F() : Foo : Boxed : ...
Лучше читать, чем википедию
Если вы заинтересованы в подобных вещах, я очень рекомендую вложить хороший учебник. Теория типов и PLT в целом довольно обширны, и без единой базы знаний вы (или, по крайней мере, я) можете бродить, не доходя никуда в течение нескольких месяцев.
Две из моих любимых книг
- Типы и язык программирования - Бен Пирс
- Практические основы языков программирования - Боб Харпер
Обе прекрасные книги, которые рассказывают о том, о чем я только что говорил, и гораздо более красивые, хорошо объясненные детали.