ebook img

Einführung in die funktionale Programmierung mit Miranda PDF

353 Pages·1991·9.846 MB·German
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Einführung in die funktionale Programmierung mit Miranda

Einführung in die funktionale Programmierung mit Miranda Von Ralf Hinze Universität Bonn EH B. G. Teubner Stuttgart 1992 Dipl.-Inform. Ralf Thomas Walter Hinze Geboren 1965 in MarI. Von 1984 bis 1990 Studium der Informatik mit Nebenfach theoretischer Medizin an der Universität Dortmund mit Abschluß Diplom. Seit 1990 wiss. Angestellter an der Abteilung Informatik der Universität Bonn. Die Deutsche Bibliothek - CIP-Einheitsaufnahme Hinze. Ralf: Einführung in die funktionale Programmierung mit Miranda / von Ralf Hinze. - Stuttgart : Teubner. 1992 ISBN 978-3-519-02287-9 ISBN 978-3-322-93090-3 (eBook) DOI 10.1007/978-3-322-93090-3 Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Ver wertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustim mung des Verlages unzulässig und strafbar. Das gilt besonders für Vervielfältigun gen. Übersetzungen. Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. © B. G. Teubner Stuttgart 1992 Dieses Buch widme ich meinen Eltern. Vorwort MIRA. You have often Begun to tell me what I am ; but stopp 'd, And teft me to a bootless inquisition, Concluding , Stay ; not yet. ' PRO. The how"'" now come ,. The very minute bids thee ope thine car. "The Tempest" von William Shakespeare (Akt 1, S::;cnc 1) Das vorliegende Buch ist aus Begleitmaterialien zu einem Programmierkurs entstanden, den ich im Sommersemester 1991 an der Universität Bonn gehalten habe. Es beschreibt grundlegende und weiterführende Kom;epte der funktionalen Programmierung und der Programmiersprache Mirandal. Eine rein funktionale Sprache wie Miranda ist aus mindestens drei Gründen eine interessante und faszinierende Alternative sowohl zu herkömmlichen, impera tiven Sprachen als auch zu hybriden Sprachen wie LISP oder Scheme, die neben einem funktionalen Kern viele imperative Konstrukte inkorporieren. 1. Funktionale Programme sind kürzer, einfacher zu verstehen und besitzen ei nen höheren Abstraktionsgrad als korrespondierende imperative Programme. 2. Sie sind einer mathematischen Behandlung einfacher zugänglich. 3. Die angenehmen mathematischen Eigenschaften (Funktionen sind Funktio nen im mathematischen Sinn) erleichtern eine Implementierung auf paralle len Rechnerarchitekturen. Insbesondere der letzte Punkt eröffnet für die Zukunft vielversprechende Perspek tiven. Miranda verkörpert die Tugenden funktionaler Sprachen in besonderer Weise. Die Syntax ist prägnant und frei von syntaktischem Ballast. Funktionen wie Typen werden mittels (rekursiver) Gleichungen definiert. Muster auf der linken Seite von Funktionsdefinitionen fördern die Lesbarkeit der Definitionen. Ein wichtiges Konzept der Programmierung ist das Abstraktionsprinzip. Mi randa unterstützt Abstraktion auf Wertebene via Funktionsdefinitionen und loka ler Definitionen, auf Typebene via generischer und abstrakter Datentypen und auf Modulebene via generischer Module. 1 Miranda ist ein eingetragenes Warenzeichen von Research Software Ltd. Vorwort V Von besonderem Interesse sind der Auswertungsmechanismus (lazy evaluation) und das polymorphe Typsystem. Der Auswertungsmechanismus erlaubt die Defi nition potentiell unendlicher Datenstrukturen und befreit den Programmierer von der Festlegung spezieller Auswertungsreihenfolgen. Das polymorphe Typsystem kombiniert Sicherheit (die typgerechte Verwen dung einer Funktion wird zur Übersetzungszeit geprüft) mit Flexibilität (unter schiedliche Verwendungen einer Funktion sind zulässig) und Bequemlichkeit (der Typ einer Funktion muß nicht deklariert werden, sondern wird hergeleitet). Konzept und Gliederung Das Buch erarbeitet Konzepte der funktionalen Programmierung mittels zahlrei cher Beispiele und weniger durch theoretische Erörterungen. Leicht verständliche oder aus anderen Sprachen bekannte Konzepte werden kurz besprochen, wohin gegen unbekannte oder für funktionale Sprachen typische Konzepte ausführlich behandelt werden. Die Sprache Miranda ist dabei stets der zentrale Bezugspunkt. Gleichwohl lassen sich große Teile des Buches ohne Schwierigkeiten auf andere funktionale Sprachen wie Baskell oder SML übertragen. Das Buch ist wie folgt gegliedert. In Kapitel 1 grenzen wir moderne funk tionale Sprachen von imperativen und hybriden Sprachen ab und geben einen kurzen Überblick über Miranda. Vordefinierte Typen und einfache Formen der Wertedefinition werden in Kapitel 2 behandelt. Kapitel 3 führt die verbleibenden Formen der Wertedefinition ein. Eine ausführliche Beschreibung des Typsystems und des Verfahrens, mit dem die Typen von Funktionen hergeleitet werden, fin det man in Kapitel 4. Dem Thema "Funktionen höherer Ordnung" ist Kapitel 5 gewidmet. Kapitel 6 beschäftigt sich mit sogenannten List-Comprehensions, die eine einfache Möglichkeit darstellen, über Listen zu iterieren. Breiten Raum nimmt die Beschreibung benutzerdefinierter Typen in Kapitel 7 ein. Wir gehen u. a. auf die Realisierung einfacher Übersetzer, auf Sortieralgorithmen (Beapsort) und auf Suchstrukturen (binäre Suchbäume, 2-3-Bäume, AVL-Bäume) ein. Kapi tel 8 befaßt sich eingehend mit dem Auswertungsmechanismus von Miranda. Dies schließt eine Vielzahl von Themen ein: Realisierung von Backtracking-Techniken, Syntaxanalyse, Übersetzung von Prolog-Prädikaten in Miranda-Funktionen, Ver arbeitung und Verwendung unendlicher Datenstrukturen. Kapitel 9 beschreibt das Modulkonzept und behandelt grundlegende Themen des Software-Engineerings. Den Abschluß bildet die Diskussion von Ein- und Ausgab.etechniken zur Defini tion interaktiver Programme in Kapitel 10. Im Anschluß an jedes Kapitel sind zahlreiche Übungsaufgaben aufgeführt, die dazu dienen, den Stoff zu vertiefen. Darüberhinaus enthält der Anhang verschie dene Vorschläge für Programmierprojekte. VI Vorwort Adressaten Das Buch richtet sich sowohl an Lernende als auch an Lehrende der Informa tik. Voraussetzung für das Studium des Buches sind elementare Informatik- und Mathematikkenntnisse, wie sie im universitären Grundstudium vermittelt werden. Der Leser sollte z. B. kontextfreie Grammatiken kennen und einfache algebraische Umformungen durchführen können. Erfahrungen mit einer (imperativen) Pro grammiersprache erweisen sich als hilfreich, sind aber streng genommen nicht not wendig. Auf Grund der vielen Übungsaufgaben und der im Anhang aufgeführten Programmierprojekte bietet sich das Buch auch als Grundlage für einen Program mierkurs oder ein Programmierpraktikum an. Hinweise an den Leser Lesern, die sich das Themengebiet im Selbststudium erarbeiten, sei die Lösung der Übungsaufgaben ans Herz gelegt. Nur auf diese Weise kann das Verständnis des Gelernten überprüft und seine Anwendung erprobt werden. Die Übungen sollten zunächst mit Papier und Bleistift gelöst werden, bevor die Korrektheit mit !-Iilfe eines Rechners (Miranda läuft unter dem Betriebssystem UNIX2 auf einer Vielzahl von Rechnern) überprüft bzw. validiert wird. Um die Unterscheidung zwischen einfachen und schwierigen Übungen zu erleichtern, sind die Aufgaben mit Folgen von maximal drei Sternen markiert, deren Anzahl proportional zum Arbeitsaufwand bzw. zum Schwierigkeitsgrad wächst. Die Programmierprojekte sollen dazu anregen, die in verschiedenen Kapiteln vorgestellten Konzepte zusammenzuführen und auf ein abgeschlossenes Problem anzuwenden. Die in Anhang A aufgeführten Vorschläge können von einem Ein zelnen innerhalb einer Woche bearbeitet werden, wohingegen das in Anhang B beschriebene Projekt innerhalb einiger Wochen nur von einer Gruppe gelöst wer den kann. Die Projekte unterstützen somit die Einübung der "Programmierung im Großen" und der Arbeit in einem Team. Notationen und Konventionen Formaler Programmtext ist in Schreibmaschinenschrift gesetzt. Falls eine im Text definierte Funktion in Miranda vordefiniert ist, wird dies durch einen Kom mentar der Form 11 = lines deutlich gemacht (lines ist in diesem Fall der Name der vordefinierten Funktion). Weicht die im Text definierte Funktion in einigen Details (z. B. im Laufzeitverhalten) von der korrespondierenden Standardfunktion ab, so wird der Kommentar 11 - lines verwendet. Generell gilt, daß Funktionen 2UNIX ist eingetragenes Warenzeichen von AT&T. Vorwort VII gleicher Bedeutung auch gleiche Namen erhalten, die evtl. durch ein Apostroph (lines ,) oder eine Ziffer (lines2) ergänzt werden. Passagen, die beim ersten Lesen ohne Verständnisverlust übersprungen werden können, sind in einer kleineren Schrift gesetzt. In einer solchen Passage wird z. B. auf Fallstricke bereits beschriebener Konzepte hingewiesen. Ich habe mich bemüht, soweit wie möglich Anglizismen zu vermeiden und deut sche Begriffe zu verwenden. Schwer zu übersetzende Ausdrücke wie Offside-Regel - bedeutet wörtlich übersetzt Abseitsregel- werden allerdings beibehalten. Dies hat den Vorteil, daß die Lektüre der fast ausschließlich englischsprachigen Arbei ten auf diesem Gebiet erleichtert wird. Noch eine Bemerkung zu weiblichen und männlichen Formen der Anrede: Wenn von "Lesern" gesprochen wird, sind stets Leserinnen und Leser gemeint. Danksagungen Mein Interesse für die "Welt der funktionalen Programmierung" wurde während meiner Studienzeit von Prof. Harald Ganzinger geweckt. Dafür möchte ich ihm meinen Dank aussprechen. Mein Dank gilt weiterhin dem Entwickler von Miranda, David Turner, und den Autoren zahlreicher Artikel und Bücher, aus denen ich stoffiich schöpfen konnte. Darüber hinaus möchte ich den Herausgebern und allen Korrektoren danken, die mich auf viele Fehler und Mängel aufmerksam gemacht haben: Prof. Hans-Jürgen Appelrath, Holger Berse, Wolfram Burgard, Prof. Volker Claus, Mark Fischer, Anja Hartmann, Ullrich Hustadt, Jürgen Kalinski, Barbara Kraft-Schlüter, Heike Kranzdorf, Pete r Schmidt, Heiner Schorn, Christoph Wedi. Ein besonderer Dank gebührt Ulrike Griefahn und Michael Meister, ohne deren Verbesserungen und Anregungen das Buch nicht in der jetzigen Form vorliegen würde. Schließlich bin ich Prof. Armin B. Cremers zu Dank verpflichtet, der mir die Arbeit an diesem Buch erst ermöglicht hat. Vielen Dank, Judith, für Deine Unterstützung während der Zeit, wo das Buch "fast fertig" war. Reaktionen jeglicher Art (insbesondere originelle Lösungen der Übungsaufga ben) sind sehr willkommen (e-mail: ralflDuran.informatik.uni-bonn.de). Bonn, den 22. September 1991 Ralf Hinze Inhaltsverzeichnis Vorwort v 1 Einleitung 1 1.1 Eigenschaften funktionaler Sprachen 2 1.2 Überblick über Miranda ..... 6 1.3 Warum nicht LISP oder Scheme? 12 1.4 Literaturhinweise 13 2 Vordefinierte Typen 15 2.1 Der Typ num . 15 2.2 Der Typ bool 16 2.3 Der Typ char 18 2.4 Tupeltypen 18 2.5 Listentypen 19 2.6 Funktionale Typen 23 2.7 Miranda-System. 28 2.8 Syntax. 33 3 Definitionen 39 3.1 Skalare Definitionen. 40 3.1.1 Die Offside-Regel 40 3.1.2 Bewachte Ausdrücke 41 3.1.3 Pattern-Matching .. 44 3.1.4 DlY -Infix-Operatoren. 49 3.2 Konforme Definitionen 51 3.3 Lokale Definitionen 52 3.4 Syntax ...... . 55 4 Typsystem 63 4.1 Parametrisierter Typpolymorphismus . . . . . . . . . . . . . . . .. 67 Inhaltsverzeichnis IX 4.2 Typinferenz ..... 70 4.3 Wertespezifikationen 79 4.4 Typsynonyme . . . . 80 4.5 Die generische Funktion show 82 4.6 Literaturhinweise 83 4.7 Syntax ..... . 84 5 Funktionen höherer Ordnung 89 5.1 Partiell parametrisiertc Funktionen 91 5.2 Operator-Sections ... 92 5.3 Generische Funktionen 93 5.4 Funktionen als Datenstrukturen 98 5.5 Implementierung von Rekursionsmustern 100 5.5.1 map und map2 .......... . 100 5.5.2 filter, dropwhile und takewhile 105 5.5.3 foldr und foldl 107 5.5.4 Kontrollstrukturen 113 5.6 Literaturhinweise 115 5.7 Syntax ..... . 116 6 List-Comprehensions 123 6.1 Einfache List-Comprehensions 123 6.2 Iterative Generatoren .... 130 6.3 Diagonalisierende List-Comprehensions 132 6.4 Syntax ................ . 133 7 Benutzerdefinierte Typen 139 7.1 Algebraische Datentypen 139 7.1.1 Aufzählungstypen . 140 7.1.2 Disjunkte Vereinigungen 143 7.1.3 Rekursive Datentypen 147 7.1.4 DIY-Infix-Operatoren. 163 7.2 Abstrakte Datentypen 164 7.3 Platzhaltertypen ... 173 X Inhaltsverzeichnis 7.4 Literaturhinweise 174 7.5 Syntax .... 175 8 Lazy Evaluation 183 8.1 Eager Evaluation versus Lazy Evaluation 183 8.2 Nichtstrikte Funktionen 188 8.3 Backtracking-Probleme . 189 8.3.1 Das n-Damen-Problem 189 8.3.2 Das Springer-Problem 196 8.4 Kombinator-Parsing .... 198 8.5 Von Prolog zu Miranda . . . · 210 8.6 Unendliche Datenstrukturen · 218 8.6.1 Simulation von synchronen Schaltwerken .222 8.6.2 Netzwerke kommunizierender Prozesse · 227 8.6.3 Primzahlen · 231 8.6.4 Memotabellen .232 8.7 Programmierung mit Unbekannten · 238 8.8 Steuerung der Auswertung · 241 8.9 Literaturhinweise ..... .243 9 Programmierung im Großen 253 9.1 Y.include- und Y.export-Direktive . · 254 9.1.1 Y.include-Direktive . .254 9.1.2 Y.export-Direktive .256 9.2 Parametrisierte Module. . . .260 9.2.1 Verwaltung von Binärbäumen · 262 9.2.2 Prioritäts-Parser .265 9.3 Software-Engineering .. 271 9.4 Programmierrichtlinien für Miranda . 280 9.5 Li terat ur hin weise .282 9.6 Syntax ...... .283 10 Interaktive Programme 285 10.1 Eingabe ....... . · 287

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.