Типи не є наборами.
Розумієте, теорія множин має ряд особливостей, які просто не стосуються типів, і навпаки . Наприклад, об’єкт має єдиний канонічний тип. Це може бути екземпляр декількох різних типів, але лише один з цих типів був використаний для інстанції. Теорія множин не має поняття "канонічних" множин.
Теорія наборів дозволяє створювати підмножини на льоту , якщо у вас є правило, яке описує, що належить до підмножини. Теорія типів цього взагалі не дозволяє. Хоча більшість мов мають Number
тип або щось подібне, вони не мають EvenNumber
типу, і не було б просто створити його. Я маю на увазі, що досить легко визначити сам тип, але будь-які існуючі Number
s, які трапляються, навіть не будуть магічно перетворені на EvenNumber
s.
Насправді, сказати, що ви можете "створити" підмножини, є дещо хитруватим, оскільки набори - це зовсім інший вид тварин. У теорії множин ці підмножини вже існують усіма нескінченними способами їх визначення. У теорії типів ми зазвичай розраховуємо мати справу з кінцевою (якщо великою) кількістю типів у будь-який момент часу. Єдині типи, про які кажуть, є ті, які ми насправді визначили, а не кожен тип, який ми могли б визначити.
Наборам заборонено прямо або опосередковано стримуватися . Деякі мови, такі як Python, надають типи з менш регулярними структурами (у Python, type
канонічний тип є type
, і object
вважається екземпляром object
). З іншого боку, більшість мов не дозволяють визначеним користувачем типам займатися подібними хитрощами.
Набори, як правило, дозволяють перекриватися, не містячись один в одному. Ця теорія є рідкістю, хоча деякі мови підтримують її у вигляді багаторазового успадкування. Інші мови, як-от Java, дозволяють лише обмежену форму цього або забороняють його повністю.
Порожній тип існує (він називається нижній тип ), але більшість мов не підтримує його чи не розглядає як тип першого класу. Також існує "тип, який містить усі інші типи" (він називається верхній тип ) і широко підтримується, на відміну від теорії множин.
NB : Як раніше зазначали деякі коментатори (до того, як нитка була перенесена в чат), можна моделювати типи з теорією множин та іншими стандартними математичними конструкціями. Наприклад, ви можете моделювати членство як відношення, а не моделювання типів як наборів. Але на практиці це набагато простіше, якщо використовувати теорію категорій замість теорії множин. Так, наприклад, Haskell моделює свою теорію типів.
Поняття «підтипу» насправді зовсім відрізняється від поняття «підмножина». Якщо X
це підтип Y
, це означає, що ми можемо замінити екземпляри Y
на екземпляри, X
і програма все ще буде "працювати" в якомусь сенсі. Це поведінка, а не структурна, хоча деякі мови (наприклад, Go, Rust, імовірно, C) обрали останню з міркувань зручності, як для програміста, так і для мовної реалізації.
a
іb
є членами цього типу, як згадує Кілліан Форт.Міклас ізоморфний записам із полямиa
таb
типуint
іdouble
- ви можете взяти такий запис і перетворити його на прикладmyclass
.