Download (1405Kb)
Download (1405Kb)
Download (1405Kb)
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Die Bedeutung der Basisdatentypen wird in der Theorie der Programmschemata [Ind94] besonders<br />
deutlich, die Schemata von Programmen unabhängig von konkreten Basisdatentypen — dort<br />
Interpretationen genannt — betrachtet.<br />
Funktionale Programmiersprachen besitzen üblicherweise einige Standardbasisdatentypen, beispielsweise<br />
ganze Zahlen (Integer), Fließkommazahlen, Zeichen (Character), logische Werte (Boolean)<br />
und Listen. Um auch Bäume und Matrizen direkt repräsentieren zu können, ermöglichen<br />
moderne funktionale Programmiersprachen wie Miranda und Haskell dem Programmierer, neue,<br />
eigene Basisdatentypen zu definieren: die sogenannten algebraischen Datentypen. Ein algebraischer<br />
Datentyp der natürlichen Zahlen läßt sich folgendermaßen in Miranda definieren:<br />
nat ::= Zero | Succ(nat)<br />
Zero und Succ heißen Konstruktoren, und Konstruktorterme (Zero,Succ(Zero), . . .) bilden den<br />
Träger des algebraischen Datentyps. Der Mechanismus des Patternmatchings ermöglicht nun die<br />
einfache und intuitive Definition von Operationen über dem algebraischen Datentyp.<br />
add(x,Zero) = x<br />
add(x,Succ(y)) = Succ(add(x,y))<br />
mult(x,Zero) = Zero<br />
mult(x,Succ(y)) = add(x,mult(x,y))<br />
Die Konstruktoren repräsentieren die Basisoperationen des algebraischen Datentyps, und das Patternmatching<br />
verbindet zusätzlich eine Testoperation mit einer Komponentenselektion.<br />
Algebraische Datentypen stellen ein äußerst mächtiges Konzept dar, da sie unter anderem die Definition<br />
von Aufzählungstypen, markierten Vereinigungen von Typen und kartesischen Produkten<br />
von Typen ermöglichen. Wie schon das obige Beispiel verdeutlicht, sind selbst die Standardbasisdatentypen<br />
als algebraische Datentypen definierbar (auf Probleme mit den ganzen und Fließkommazahlen<br />
gehen wir später noch ein). Dies rechtfertigt, im weiteren funktionale Programmiersprachen<br />
zu betrachten, die nur algebraische Datentypen besitzen. Die Standardbasisdatentypen lassen sich<br />
schlicht als effizientere Realisierungen entsprechender algebraischer Datentypen auffassen. In dieser<br />
Arbeit untersuchen wir, wie sich für derartige konstruktorbasierte funktionale Programmiersprachen<br />
sinnvoll Semantiken definieren lassen, ähnlich wie dies in [Vui74b] für Funktionsschemata<br />
getan wurde.<br />
Funktionale Programmiersprachen zeichnen sich durch die Möglichkeit aus, daß Funktionen höherer<br />
Ordnung, sogenannte Funktionale, spezifizierbar sind. Wird der λ-Kalkül oder werden Kombinatorsysteme<br />
als Grundlage funktionaler Programme verwendet, so ergeben sich Funktionale praktisch<br />
automatisch. Sie sind jedoch kein notwendiger Bestandteil einer funktionalen Programmiersprache.<br />
Auch bei einem Verzicht auf Funktionale besitzt man noch eine vollwertige (bezüglich der<br />
natürlichen Zahlen mit Sicherheit universelle) Programmiersprache. Es existieren auch reale funktionale<br />
Programmiersprachen wie beispielsweise Sisal, die nur die Spezifikation von Funktionen erster<br />
Ordnung ermöglichen. Auch rekursive Funktionsschemata sind im allgemeinen erster Ordnung<br />
([Ind94]). Die hier zu untersuchende semantische Beschreibung auf Konstruktoren basierender Basisdatentypen<br />
und des Patternmatchings ist unabhängig von dem Vorhandensein von Funktionalen.<br />
Semantiken funktionaler Programmiersprachen höherer Ordnung sind mathematisch aufwendiger,<br />
da aufgrund der Funktionale ein spezifizierter Datentyp keine einfache Algebra mehr sein kann.<br />
Daher beschränken wir uns auf konstruktorbasierte funktionale Programme erster Ordnung.<br />
5