Typvergleiche


... [ Seminar "Programmierkonzepte und Programmiersprachen"] ... [ Inhaltsübersicht ] ... [ zurück ] ... [ weiter ]

Übersicht: Typvergleiche


Strukturelle Gleichheit

Typvergleiche spielen eine wichtige Rolle bei der Typüberprüfung. Dies gilt nicht nur für ML und Haskell, sondern für alle getypten Sprachen. Grundsätzlich gibt es zwei verschiedene Ansätze für die Frage, ob zwei Typen gleich sind.

Bei der Strukturellen Gleichheit sieht man Typen als Menge von Werten an. Zwei Mengen sind gleich, wenn sie die selben Werte enthalten.
So ist zum Beispiel jeder Typ, der als kartesische Produkt A*B deklariert ist zu jeden Typ äquivalent, der in der selben Art definiert wurde. Sind A und B unterschiedliche Typen, kommt es noch auf die Reihenfolge der Typen an. So ist das karthesische Produkt A*B ungleich B*A, da ersteres die Paare (a,b) enthält und letzteres (b,a).
Zusammenfassend kann man sagen, dass zwei Typen gleich sind, wenn sie die gleiche Struktur besitzen. Gleiche Struktur bedeutet in diesen Fall, dass die selben Typkonstruktoren mit den selben einfachen Typen verwendet wurden.

Beispiel: Strukturelle Gleichheit

Struct Rec1{char x; int y; char z[10];};
Struct Rec2{char x; int y; char z[10];};
Struct Rec3{int y; char x; char z[10];};


Die structs Rec1 und Rec2 sind strukturell gleich.
Rec1 und Rec3 sind strukturell unterschiedlich, da die Felder in verschiedener Reihenfolge vorkommen.

Struct RecA{char x; int y;};
Struct RecB {char a; int a;};


Diese beiden structs sind nicht äquivalent, da die Feldbezeichnungen unterschiedlich sind.

Struct Rec A{char x; int y;} a;
Typedef struct RecA RecA;
Typedef struct{char x; int y;} RecB;
RecB b;
Struct{char x; int y;}c


In diesen Beispiel sind alle Structs strukturell äquivalent. Typnamen haben keinen Einfluss auf die Bewertung, ob zwei Typen strukturell gleich sind. Die Typnamen werden hier einfach durch ihren zugehörigen Typausdruck der Typdeklaration ersetzt. Einzige Ausnahme hierfür sind rekursive Datentypen, wo das Ersetzen der Typnamen zu endlosen Rekursionen führen würde


Namensgleichheit

Zwei Typen sind nur dann gleich, wenn sie den selben Namen haben. Zwei Variablen sind nur dann gleich, wenn bei der Deklaration der exakt selbe Typname benutzt wurde.
Namensäquivalenz wurde entwickelt, da es bei der strukturellen Äquivalenz Probleme gibt Rekursive Strukturen zu überprüfen. Das Ersetzen der Typnamen durch den zugehörigen Typausdruck der Deklaration kann z.B. bei Listen zu Endlosschleifen führen.
Namensäquivalenz ist einfacher zu überprüfen als strukturelle Äquivalenz, solange die Programmiersprache erzwingt, dass jeder Typ einen expliziten Namen zu besitzen hat.
Die Namensäquivalenz bezieht sich auch auf Aliases. Deklariert man einen Alias für einen Typ, ist der Alias nicht äquivalent mit dem Typ für den er verwendet wird.

ML und Haskell benutzen Namensäquivalenz bei vom Programmierer definierten Daten. Strukturelle Äquivalenz wird hingegen bei den vordefinierten Datentypen benutzt.


... [ Seminar "Programmierkonzepte und Programmiersprachen"] ... [ Inhaltsübersicht ] ... [ zurück ] ... [ Seitenanfang ] ... [ weiter ]