1unitedpower: eval()

Beitrag lesen

Bei Elmar sollte wohl auch => stehen. Nur: welche Sprache soll das sein? Du hast den Code mit js gekennzeichnet, aber JavaScript ist es nicht.

Ach was glaubst Du warum das abstrakter Datentyp heißt 😉

Das was du zeigst, ist aber auch kein abstrakter Datentyp. Das ist nur ein Wert. Im Namen Datentyp steckt ja schon das Wörtchen Typ und nicht Wert drin. Die meisten Programmiersprachen unterscheiden zwischen Wert-Ausdrücken und Typ-Ausdrücken. JavaScript hat letzteres nicht, deshalb ist es schwierig bei JavaScript überhaupt von Datentypen zu sprechen. TypeScript ergänz JavaScript um diese Typ-Ausdrücke und daran lässt sich dann auch der Unterschied zwischen konkreten und abstrakten Datentypen erklären. Die folgenden Beispiele definieren jeweils konkrete Datentypen StringList und NumberList:

interface StringList {
    empty: StringList;
    prepend : (head: String, tail: StringList) => StringList;
}

interface NumberList {
    empty: NumberList;
    prepend : (head: Number, tail: NumberList) => NumberList;
}

Das Problem hier ist, dass sich die Implemtierungen von StringList und NumberList wahrscheinlich überhaupt nicht voneinander unterscheiden. Ein abstrakter Datentyp nutzt das aus und bietet die Möglichkeit eine Implementierung für beides anzugeben: Für Listen mit Zeichenketten, für Listen mit Zahlen und ganz allgemein für Listen mit beliebigen Inhaltstypen. In TypeScript sähe die entsprechende Typdefinition dafür so aus:

interface List<a> {
    empty: List<a>;
    prepend : (head: a, tail: List<a>) => List<a>;
}

Der Typparameter a steht hier stellvertrend für den Datentypen, den die Liste kapselt.

Ein besserer Ausdruck für abstrakter Datentyp ist übrigens polymorpher Datentyp und für konkrete Datentypen monomorpher Datentyp.

Du dagegen hast den Unterschied zwischen Arrays und Dictionaries erklärt, mit den Ausführungen hast du im Übrigen auch recht, nur ist der Bezug zu abstrakten Datentypen fehl am Platz.