Типы не являются наборами.
Видите ли, теория множеств имеет ряд особенностей, которые просто не применимы к типам, и наоборот . Например, объект имеет один канонический тип. Это может быть экземпляр нескольких разных типов, но только один из этих типов использовался для его создания. Теория множеств не имеет понятия «канонических» множеств.
Теория множеств позволяет вам создавать подмножества на лету , если у вас есть правило, которое описывает, что принадлежит подмножеству. Теория типов вообще не позволяет этого. В то время как большинство языков имеют Number
тип или что - то подобное, они не имеют EvenNumber
типа, и не было бы просто создать. Я имею в виду, достаточно просто определить сам тип, но любые существующие Number
s, которые оказываются даже, не будут волшебным образом преобразованы в EvenNumber
s.
На самом деле, говорить, что вы можете «создавать» подмножества, несколько неискренне, потому что наборы - это совсем другой вид животных. В теории множеств эти подмножества уже существуют во всех бесконечных способах их определения. В теории типов мы обычно ожидаем иметь дело с конечным (если большим) числом типов в любой момент времени. Говорят, что существуют только те типы, которые мы фактически определили, а не каждый тип, который мы могли бы определить.
Наборы не могут прямо или косвенно содержать себя . Некоторые языки, такие как Python, предоставляют типы с менее регулярными структурами (в Python type
канонический тип есть type
и object
считается экземпляром object
). С другой стороны, большинство языков не позволяют пользовательским типам участвовать в подобном обмане.
Наборы обычно допускают перекрытие, не будучи заключенными друг в друга. Это редко встречается в теории типов, хотя некоторые языки поддерживают ее в форме множественного наследования. Другие языки, такие как Java, допускают только ограниченную форму или полностью ее запрещают.
Пустой тип существует (он называется нижним типом ), но большинство языков его не поддерживают или не рассматривают как тип первого класса. «Тип, который содержит все другие типы», также существует (он называется верхним типом ) и широко поддерживается, в отличие от теории множеств.
NB . Как ранее указывали некоторые комментаторы (до того как поток был перемещен в чат), можно моделировать типы с помощью теории множеств и других стандартных математических конструкций. Например, вы можете моделировать членство в типе как отношение, а не моделировать типы как наборы. Но на практике это намного проще, если вы используете теорию категорий вместо теории множеств. Так Хаскелл моделирует свою теорию типов, например.
Понятие «подтип» действительно очень отличается от понятия «подмножество». Если X
это подтип Y
, это означает, что мы можем заменить экземпляры Y
на экземпляры, X
и программа все равно будет «работать» в некотором смысле. Это скорее поведенческий, чем структурный характер, хотя некоторые языки (например, Go, Rust, возможно, C) выбрали последний из соображений удобства либо для программиста, либо для языковой реализации.
a
иb
являются членами этого типа, как упоминает Киллиан Форт. Myclass изоморфен записям с полямиa
иb
типаint
иdouble
- вы можете взять такую запись и превратить ее в экземплярmyclass
.