Typen sind keine Mengen.
Sie sehen, die Mengenlehre hat eine Reihe von Merkmalen, die einfach nicht für Typen gelten und umgekehrt . Beispielsweise hat ein Objekt einen einzelnen kanonischen Typ. Es kann sich um eine Instanz mehrerer verschiedener Typen handeln, aber nur einer dieser Typen wurde verwendet, um sie zu instanziieren. Die Mengenlehre hat keine Vorstellung von "kanonischen" Mengen.
Mit der Mengenlehre können Sie Teilmengen im laufenden Betrieb erstellen , wenn Sie eine Regel haben, die beschreibt, was zur Teilmenge gehört. Die Typentheorie erlaubt dies im Allgemeinen nicht. Während die meisten Sprachen einen Number
Typ oder ähnliches haben, haben sie weder einen EvenNumber
Typ, noch wäre es einfach, einen zu erstellen. Ich meine, es ist einfach genug, den Typ selbst zu definieren, aber alle vorhandenen Number
s, die gerade sind, werden nicht auf magische Weise in EvenNumber
s umgewandelt.
Zu sagen, dass Sie Teilmengen "erstellen" können, ist eigentlich etwas unaufrichtig, da Mengen eine ganz andere Art von Tier sind. In der Mengenlehre existieren diese Teilmengen bereits auf alle unendlichen Arten, wie Sie sie definieren können. In der Typentheorie erwarten wir normalerweise, dass es sich zu einem bestimmten Zeitpunkt um eine endliche (wenn auch große) Anzahl von Typen handelt. Die einzigen Typen, die existieren sollen, sind diejenigen, die wir tatsächlich definiert haben, nicht jeder Typ, den wir möglicherweise definieren könnten.
Sets dürfen sich weder direkt noch indirekt enthalten . Einige Sprachen, wie z. B. Python, bieten Typen mit weniger regelmäßigen Strukturen (in Python type
ist type
und object
wird der kanonische Typ als Instanz von angesehen object
). Andererseits erlauben die meisten Sprachen nicht, dass benutzerdefinierte Typen sich auf diese Art von Tricks einlassen.
Sätze dürfen sich normalerweise überlappen, ohne ineinander enthalten zu sein. Dies ist in der Typentheorie ungewöhnlich, obwohl einige Sprachen dies in Form einer Mehrfachvererbung unterstützen. Andere Sprachen wie Java erlauben nur eine eingeschränkte Form davon oder verbieten sie vollständig.
Der leere Typ existiert (er wird als unterster Typ bezeichnet ), aber die meisten Sprachen unterstützen ihn nicht oder betrachten ihn nicht als erstklassigen Typ. Der "Typ, der alle anderen Typen enthält" existiert ebenfalls (er wird als Top-Typ bezeichnet ) und wird im Gegensatz zur Mengenlehre weitgehend unterstützt.
NB : Wie einige Kommentatoren bereits erwähnt haben (bevor der Thread in den Chat verschoben wurde), ist es möglich, Typen mit Mengenlehre und anderen mathematischen Standardkonstrukten zu modellieren. Sie können beispielsweise die Typzugehörigkeit als Beziehung modellieren, anstatt Typen als Mengen zu modellieren. In der Praxis ist dies jedoch viel einfacher, wenn Sie die Kategorietheorie anstelle der Mengenlehre verwenden. So modelliert Haskell beispielsweise seine Typentheorie.
Der Begriff "Subtypisierung" unterscheidet sich wirklich stark vom Begriff "Teilmenge". Wenn X
es sich um einen Subtyp von handelt Y
, bedeutet dies, dass wir Instanzen von durch Instanzen von ersetzen können und das Programm in gewissem Sinne immer noch "funktioniert". Dies ist eher verhaltensbezogen als strukturell, obwohl einige Sprachen (z. B. Go, Rust, wohl C) letztere aus Gründen der Benutzerfreundlichkeit entweder für den Programmierer oder für die Sprachimplementierung ausgewählt haben.Y
X
a
undb
ist Mitglied dieses Typs, wie Killian Forth erwähnt. Myclass ist isomorph zu Datensätzen mit Felderna
undb
Typint
unddouble
- Sie könnten einen solchen Datensatz nehmen und in einen solchen umwandeln eine Instanz vonmyclass
.