Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmen und Datenstrukturen – Einführung Materialien zur Vorlesung: Abschnitt A D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg c Winter 2008/09, 30. November 2008, 2008/09 D. Rösner D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Gliederung I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Listenkomprehension Einleitung Verwendung Beispiel Aufwandbetrachtungen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Gliederung II 16 17 18 19 20 21 22 23 24 25 26 27 28 O-Notation Listenfunktionen Lexik Prelude Listen Weitere Funktionen Funktionen . . . höherer Ordnung Abstraktion . . . als Wert Funktionen und Prozesse Endrekursion Einleitung Typsynonyme Algebraische Typen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Gliederung III 29 30 31 32 33 34 35 36 Aufzählungstypen Produkttypen Rekursive algebraische Typen Polymorphie Variante Einleitung Eq Klassen Vererbung Beispiele Ord Enum Show, Read Aufwandreduktion: Beispiel Exponentiation D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Gliederung IV Listentraversierungen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Hinweis zum Copyright Diese Materialien sind nur gedacht für eingeschriebene HörerInnen sowie Tutoren und Lehrende der Vorlesung ’Algorithmen und Datenstrukturen’ im WS 2008/2009. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Hinweis zum Copyright Diese Materialien sind nur gedacht für eingeschriebene HörerInnen sowie Tutoren und Lehrende der Vorlesung ’Algorithmen und Datenstrukturen’ im WS 2008/2009. Jede andere Verwendung (insbesondere die Weitergabe an Dritte und jede Speicherung in öffentlich zugänglichen elektronischen Medien) bedarf der vorherigen schriftlichen Zustimmung des Autors. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Hinweis zum Copyright Diese Materialien sind nur gedacht für eingeschriebene HörerInnen sowie Tutoren und Lehrende der Vorlesung ’Algorithmen und Datenstrukturen’ im WS 2008/2009. Jede andere Verwendung (insbesondere die Weitergabe an Dritte und jede Speicherung in öffentlich zugänglichen elektronischen Medien) bedarf der vorherigen schriftlichen Zustimmung des Autors. c 2008/2009, Prof. Dr. D. Rösner ([email protected]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik ist die Wissenschaft, (aus: [BM96]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik ist die Wissenschaft, Technik und Anwendung (aus: [BM96]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik ist die Wissenschaft, Technik und Anwendung der maschinellen Verarbeitung und (aus: [BM96]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik ist die Wissenschaft, Technik und Anwendung der maschinellen Verarbeitung und Übermittlung von Informationen. (aus: [BM96]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik umfasst D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik umfasst Theorie, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik umfasst Theorie, Methodik, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik umfasst Theorie, Methodik, Analyse und Konstruktion, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik umfasst Theorie, Methodik, Analyse und Konstruktion, Anwendung, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik umfasst Theorie, Methodik, Analyse und Konstruktion, Anwendung, Auswirkung des Einsatzes. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik umfasst Theorie, Methodik, Analyse und Konstruktion, Anwendung, Auswirkung des Einsatzes. (vgl: [BM96]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Teilgebiete: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Teilgebiete: Theoretische Informatik, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Teilgebiete: Theoretische Informatik, Technische Informatik, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Teilgebiete: Theoretische Informatik, Technische Informatik, Praktische Informatik, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Teilgebiete: Theoretische Informatik, Technische Informatik, Praktische Informatik, Angewandte Informatik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? historische Wurzeln in D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? historische Wurzeln in Mathematik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? historische Wurzeln in Mathematik Elektrotechnik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? historische Wurzeln in Mathematik Elektrotechnik Kybernetik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? historische Wurzeln in Mathematik Elektrotechnik Kybernetik heute Einfluss auf fast alle Wissenschaften D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? historische Wurzeln in Mathematik Elektrotechnik Kybernetik heute Einfluss auf fast alle Wissenschaften . . . und alle Lebensbereiche (Stichwort: Informationsgesellschaft) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik Kunstwort aus Information D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik Kunstwort aus Information in Analogie zu Mathematik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik Kunstwort aus Information in Analogie zu Mathematik in Deutschland und Frankreich (‘informatique’) geprägt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik Kunstwort aus Information in Analogie zu Mathematik in Deutschland und Frankreich (‘informatique’) geprägt im engl. Sprachraum: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik Kunstwort aus Information in Analogie zu Mathematik in Deutschland und Frankreich (‘informatique’) geprägt im engl. Sprachraum: computer science (Computerwissenschaft) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Was ist Informatik? Informatik Kunstwort aus Information in Analogie zu Mathematik in Deutschland und Frankreich (‘informatique’) geprägt im engl. Sprachraum: computer science (Computerwissenschaft) auch: computing science D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Informatik zentraler Begriff: Algorithmus D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Informatik zentraler Begriff: Algorithmus mechanisch ausführbares Verfahren zur Lösung eines Problems D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Informatik zentraler Begriff: Algorithmus mechanisch ausführbares Verfahren zur Lösung eines Problems nach Al-Chowarizmi (ca. 780 – 850), persischer Mathematiker D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik mechanische Rechenmaschinen für Grundrechenarten D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik mechanische Rechenmaschinen für Grundrechenarten u.a. von D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik mechanische Rechenmaschinen für Grundrechenarten u.a. von Schickard (1592 – 1635) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik mechanische Rechenmaschinen für Grundrechenarten u.a. von Schickard (1592 – 1635) Pascal (1623 – 1662) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik mechanische Rechenmaschinen für Grundrechenarten u.a. von Schickard (1592 – 1635) Pascal (1623 – 1662) Leibniz (1646 – 1716) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik mechanische Rechenmaschinen für Grundrechenarten u.a. von Schickard (1592 – 1635) Pascal (1623 – 1662) Leibniz (1646 – 1716) Problem: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik mechanische Rechenmaschinen für Grundrechenarten u.a. von Schickard (1592 – 1635) Pascal (1623 – 1662) Leibniz (1646 – 1716) Problem: nicht programmierbar D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik mechanische Rechenmaschinen für Grundrechenarten u.a. von Schickard (1592 – 1635) Pascal (1623 – 1662) Leibniz (1646 – 1716) Problem: nicht programmierbar Algorithmen für Grundrechenarten fest eingebaut D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Computer ist ‘frei programmierbar’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Computer ist ‘frei programmierbar’ im Programmspeicher werden bel. Programme abgelegt, die der Computer dann ausführt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Computer ist ‘frei programmierbar’ im Programmspeicher werden bel. Programme abgelegt, die der Computer dann ausführt durch Programmierbarkeit entsteht universelles Werkzeug D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Vorläufer programmierbarer Geräte D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Vorläufer programmierbarer Geräte Programmsteuerung von Musikautomaten D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Vorläufer programmierbarer Geräte Programmsteuerung von Musikautomaten Jacquard (1805): durch gelochte Holzplättchen gesteuerter Webstuhl D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Vorläufer programmierbarer Geräte Programmsteuerung von Musikautomaten Jacquard (1805): durch gelochte Holzplättchen gesteuerter Webstuhl Hermann Hollerith (1886): Lochkarte D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Charles Babbage (1791 – 1871): Analytical Engine D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Charles Babbage (1791 – 1871): Analytical Engine engl. Mathematiker D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Charles Babbage (1791 – 1871): Analytical Engine engl. Mathematiker mechanische Rechenmaschine D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Charles Babbage (1791 – 1871): Analytical Engine engl. Mathematiker mechanische Rechenmaschine Idee der Steuerung durch gespeicherte Programme nach dem Prinzip von Jacquard D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Charles Babbage (1791 – 1871): Analytical Engine engl. Mathematiker mechanische Rechenmaschine Idee der Steuerung durch gespeicherte Programme nach dem Prinzip von Jacquard gescheitert an Problemen der technischen Realisierung D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Ada Lovelace, 1815 – 1852 s.a. http://en.wikipedia.org/wiki/Ada_Lovelace D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Ada Lovelace, 1815 – 1852 die erste Programmiererin s.a. http://en.wikipedia.org/wiki/Ada_Lovelace D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Ada Lovelace, 1815 – 1852 die erste Programmiererin Zusammenarbeit mit Babbage s.a. http://en.wikipedia.org/wiki/Ada_Lovelace D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Ada Lovelace, 1815 – 1852 die erste Programmiererin Zusammenarbeit mit Babbage Namensgeberin des Gebäudes der FIN s.a. http://en.wikipedia.org/wiki/Ada_Lovelace D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Konrad Zuse (1910 – 1995) Quelle: http://archive.computerhistory.org/ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Konrad Zuse (1910 – 1995) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Konrad Zuse (1910 – 1995) 1934: Idee, statt Dezimalsystem das Dualsystem und die Gleitkommadarstellung zum maschinellen Rechnen zu verwenden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Konrad Zuse (1910 – 1995) 1934: Idee, statt Dezimalsystem das Dualsystem und die Gleitkommadarstellung zum maschinellen Rechnen zu verwenden 1941: Z3 fertiggestellt (elektromechanischer Rechner auf Basis von Relaistechnik mit Programmsteuerung durch Lochstreifen) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Konrad Zuse (1910 – 1995) 1934: Idee, statt Dezimalsystem das Dualsystem und die Gleitkommadarstellung zum maschinellen Rechnen zu verwenden 1941: Z3 fertiggestellt (elektromechanischer Rechner auf Basis von Relaistechnik mit Programmsteuerung durch Lochstreifen) Programmiersprache Plankalkül D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik Konrad Zuse (1910 – 1995) 1934: Idee, statt Dezimalsystem das Dualsystem und die Gleitkommadarstellung zum maschinellen Rechnen zu verwenden 1941: Z3 fertiggestellt (elektromechanischer Rechner auf Basis von Relaistechnik mit Programmsteuerung durch Lochstreifen) Programmiersprache Plankalkül D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1944: Harvard Mark I von H.H.Aiken (1900 – 1973) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1944: Harvard Mark I von H.H.Aiken (1900 – 1973) dezimales Zahlensystem D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1944: Harvard Mark I von H.H.Aiken (1900 – 1973) dezimales Zahlensystem Additionszeit 0.3 sec D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1944: Harvard Mark I von H.H.Aiken (1900 – 1973) dezimales Zahlensystem Additionszeit 0.3 sec Multiplikationszeit 6 sec D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1944: Harvard Mark I von H.H.Aiken (1900 – 1973) dezimales Zahlensystem Additionszeit 0.3 sec Multiplikationszeit 6 sec D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1946: ENIAC von J.P. Eckert und J.W. Mauchly D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1946: ENIAC von J.P. Eckert und J.W. Mauchly erster vollelektronischer Rechner (18000 Röhren) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1946: ENIAC von J.P. Eckert und J.W. Mauchly erster vollelektronischer Rechner (18000 Röhren) Multiplikationszeit 3 msec D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1946: ENIAC von J.P. Eckert und J.W. Mauchly erster vollelektronischer Rechner (18000 Röhren) Multiplikationszeit 3 msec D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen John von Neumann (1903 – 1957) Quelle: http://en.wikipedia.org/wiki/Von_Neumann D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1946: John von Neumann (1903 – 1957): John von Neumann (1903 – 1957) Quelle: http://en.wikipedia.org/wiki/Von_Neumann D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1946: John von Neumann (1903 – 1957): Idee, Programm im Speicher des Computers abzulegen John von Neumann (1903 – 1957) Quelle: http://en.wikipedia.org/wiki/Von_Neumann D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1946: John von Neumann (1903 – 1957): Idee, Programm im Speicher des Computers abzulegen sog. von-Neumann-Computer John von Neumann (1903 – 1957) Quelle: http://en.wikipedia.org/wiki/Von_Neumann D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik amerikanische Entwicklungen 1946: John von Neumann (1903 – 1957): Idee, Programm im Speicher des Computers abzulegen sog. von-Neumann-Computer ab 1950: industrielle Rechnerproduktion John von Neumann (1903 – 1957) Quelle: http://en.wikipedia.org/wiki/Von_Neumann D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik ab 1957 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik ab 1957 höhere Programmiersprachen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik ab 1957 höhere Programmiersprachen: FORTRAN D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik ab 1957 höhere Programmiersprachen: FORTRAN LISP D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik ab 1957 höhere Programmiersprachen: FORTRAN LISP davor: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vorgeschichte der Informatik ab 1957 höhere Programmiersprachen: FORTRAN LISP davor: nur Maschinensprachen (Assembler) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiersprache Haskell: benannt nach Haskell B. Curry D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiersprache Haskell: benannt nach Haskell B. Curry einer der Pioniere des λ-Kalkül D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiersprache Haskell: benannt nach Haskell B. Curry einer der Pioniere des λ-Kalkül erste Spezifikation der Sprache Ende 80er Jahre D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiersprache Haskell: benannt nach Haskell B. Curry einer der Pioniere des λ-Kalkül erste Spezifikation der Sprache Ende 80er Jahre aktuelle Version: Haskell 98 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiersprache Haskell: benannt nach Haskell B. Curry einer der Pioniere des λ-Kalkül erste Spezifikation der Sprache Ende 80er Jahre aktuelle Version: Haskell 98 Download, Tutorials, usw.: http://www.haskell.org/ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Programmierumgebung Hugs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Programmierumgebung Hugs Haskell Users Gofer System D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Programmierumgebung Hugs Haskell Users Gofer System frei erhältlicher Interpreter D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Programmierumgebung Hugs Haskell Users Gofer System frei erhältlicher Interpreter für alle gängigen Plattformen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: Addition: + D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: Addition: + Subtraktion: - D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: Addition: + Subtraktion: Multiplikation: * D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: Addition: + Subtraktion: Multiplikation: * Division: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: Addition: + Subtraktion: Multiplikation: * Division: ganzzahlig: ‘div‘ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: Addition: + Subtraktion: Multiplikation: * Division: ganzzahlig: ‘div‘ Gleitkomma: / D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: Addition: + Subtraktion: Multiplikation: * Division: ganzzahlig: ‘div‘ Gleitkomma: / Exponentiation: ^ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: Addition: + Subtraktion: Multiplikation: * Division: ganzzahlig: ‘div‘ Gleitkomma: / Exponentiation: ^ Beachte: es gelten die üblichen Vorrangregeln (Präzedenzregeln) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell Elementarer Einstieg verwende Hugs als ’Taschenrechner’ Grundrechenarten: Addition: + Subtraktion: Multiplikation: * Division: ganzzahlig: ‘div‘ Gleitkomma: / Exponentiation: ^ Beachte: es gelten die üblichen Vorrangregeln (Präzedenzregeln) ansonsten: Verwenden von Klammern D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis funktionale Programme in Haskell Definitionen von Funktionen und anderen Werten durch Gleichungen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis funktionale Programme in Haskell Definitionen von Funktionen und anderen Werten durch Gleichungen Definition assoziiert Namen (Identifikator) mit Wert eines bestimmten Typs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis funktionale Programme in Haskell Definitionen von Funktionen und anderen Werten durch Gleichungen Definition assoziiert Namen (Identifikator) mit Wert eines bestimmten Typs Syntax: <name> :: <type> <name> = <expression> D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis funktionale Programme in Haskell cont. lies ‘::’ als ‘hat Typ’ oder ‘ist vom Typ’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis funktionale Programme in Haskell cont. lies ‘::’ als ‘hat Typ’ oder ‘ist vom Typ’ Beispiele: size :: Int size = 12 + 13 square :: Int -> Int square n = n * n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis zwei Arten von Dateistilen: Skripte (Extension ‘.hs’): alles ist Programmtext, sofern nicht explizit als Kommentar gekennzeichnet D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis zwei Arten von Dateistilen: Skripte (Extension ‘.hs’): alles ist Programmtext, sofern nicht explizit als Kommentar gekennzeichnet Kommentare bis Zeilenende eingeleitet durch zwei aufeinanderfolgende ‘-’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis zwei Arten von Dateistilen: Skripte (Extension ‘.hs’): alles ist Programmtext, sofern nicht explizit als Kommentar gekennzeichnet Kommentare bis Zeilenende eingeleitet durch zwei aufeinanderfolgende ‘-’ Abschnittskommentare zwischen ‘{-’ und ‘-}’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis zwei Arten von Dateistilen: cont literate Skripte (Extension ‘.lhs’): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis zwei Arten von Dateistilen: cont literate Skripte (Extension ‘.lhs’): alles ist Kommentar, sofern nicht am Zeilenanfang durch ‘>’ als Programmzeile gekennzeichnet D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis zwei Arten von Dateistilen: cont literate Skripte (Extension ‘.lhs’): alles ist Kommentar, sofern nicht am Zeilenanfang durch ‘>’ als Programmzeile gekennzeichnet literat . . . ‘wörtlich’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel eines Skripts {... mehrere Zeilen Kommentartext ... -} -- Berechnung der Fakultät mit Konditional if fak :: Int -> Int fak n = if n == 0 then 1 else n * fak (n - 1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel eines literaten Skripts Die Berechnung der Funktion Fakultät ist ein Standardbeispiel fuer Rekursion. > fak :: Int -> Int > fak n = if n == 0 then 1 else n * fak (n - 1) Eine Variante mit Pattern-Matching: > fak 0 = 1 > fak n = n * fak (n - 1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – Sprachelemente Typisierung: jedes Objekt in Haskell hat einen wohldefinierten Typ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – Sprachelemente Typisierung: jedes Objekt in Haskell hat einen wohldefinierten Typ Zweck der Typisierung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – Sprachelemente Typisierung: jedes Objekt in Haskell hat einen wohldefinierten Typ Zweck der Typisierung: frühzeitiges Erkennen von Programmierfehlern (type checking) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – Sprachelemente Typisierung: jedes Objekt in Haskell hat einen wohldefinierten Typ Zweck der Typisierung: frühzeitiges Erkennen von Programmierfehlern (type checking) schon vor Programmausführung (statische Analyse) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – Sprachelemente vordefinierte elementare Typen (auch Sorten genannt) für Konstante (= nullstellige Funktionen): Bool Int Char Float Integer Rational Double Vorschau: durch Deklaration mit type lassen sich benutzerdefinierte Typen einführen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Zur Unterscheidung zwischen Int und Integer Zur Klasse Int gehören ganze Zahlen, die sich mit einer festen Zahl von Bytes darstellen lassen. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Zur Unterscheidung zwischen Int und Integer Zur Klasse Int gehören ganze Zahlen, die sich mit einer festen Zahl von Bytes darstellen lassen. der Wert der Variablen maxBound::Int gibt die grösste als Int darstellbare ganze Zahl an. Dieser Wert ist (bei Hugs for Windows) 2147483647. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Zur Unterscheidung zwischen Int und Integer Zur Klasse Int gehören ganze Zahlen, die sich mit einer festen Zahl von Bytes darstellen lassen. der Wert der Variablen maxBound::Int gibt die grösste als Int darstellbare ganze Zahl an. Dieser Wert ist (bei Hugs for Windows) 2147483647. Will man beliebig grosse ganze Zahlen verarbeiten, so sollte man den Typ Integer verwenden. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typisierung cont. Typ von Funktionen (auch Funktionalität genannt) : Definitions- und Wertebereich durch -> getrennt angegeben D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typisierung cont. Typ von Funktionen (auch Funktionalität genannt) : Definitions- und Wertebereich durch -> getrennt angegeben Beispiel: double :: Int -> Int double n = 2*n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typisierung cont. Typ von Funktionen (auch Funktionalität genannt) : Definitions- und Wertebereich durch -> getrennt angegeben Beispiel: double :: Int -> Int double n = 2*n bei mehreren Argumenten werden deren Typen durch -> verbunden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typisierung cont. Typ von Funktionen (auch Funktionalität genannt) : Definitions- und Wertebereich durch -> getrennt angegeben Beispiel: double :: Int -> Int double n = 2*n bei mehreren Argumenten werden deren Typen durch -> verbunden Beispiel: max mit 2 Argumenten aus Int und Wert aus Int max :: Int -> Int -> Int D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typisierung cont. Interpretation einer Typdeklaration wie scale :: Picture -> Int -> Picture D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typisierung cont. Interpretation einer Typdeklaration wie scale :: Picture -> Int -> Picture erstens: scale hat zwei Argumente: das erste ist vom (nutzerdefinierten) Typ Picture, das zweite vom (vordefinierten) Typ Int D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typisierung cont. Interpretation einer Typdeklaration wie scale :: Picture -> Int -> Picture erstens: scale hat zwei Argumente: das erste ist vom (nutzerdefinierten) Typ Picture, das zweite vom (vordefinierten) Typ Int zweitens: das Ergebnis der Anwendung von scale ist vom Typ Picture D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren + . . . Summe zweier Zahlen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren + . . . Summe zweier Zahlen * . . . Produkt zweier Zahlen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren + . . . Summe zweier Zahlen * . . . Produkt zweier Zahlen ˆ . . . Exponentiation: 2 ˆ 3 gibt 8 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren + . . . Summe zweier Zahlen * . . . Produkt zweier Zahlen ˆ . . . Exponentiation: 2 ˆ 3 gibt 8 - ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren + . . . Summe zweier Zahlen * . . . Produkt zweier Zahlen ˆ . . . Exponentiation: 2 ˆ 3 gibt 8 - ... Differenz, wenn infix verwendet; D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren + . . . Summe zweier Zahlen * . . . Produkt zweier Zahlen ˆ . . . Exponentiation: 2 ˆ 3 gibt 8 - ... Differenz, wenn infix verwendet; umgekehrtes Vorzeichen bei Präfixverwendung (vgl. negate) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren cont. div . . . ganzzahlige Division D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren cont. div . . . ganzzahlige Division mod . . . Rest bei ganzzahliger Division (modulo) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren cont. div . . . ganzzahlige Division mod . . . Rest bei ganzzahliger Division (modulo) abs . . . Absolutbetrag D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte arithmetische Operatoren cont. div . . . ganzzahlige Division mod . . . Rest bei ganzzahliger Division (modulo) abs . . . Absolutbetrag negate . . . ändere Vorzeichen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte Vergleichsoperatoren für ganze Zahlen, d.h. Typ Int -> Int -> Bool: >, >=, ==, / =, <=, < D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte Vergleichsoperatoren für ganze Zahlen, d.h. Typ Int -> Int -> Bool: >, >=, ==, / =, <=, < diese Vergleichsoperatoren sind – wie auch die arithmetischen Operatoren – ‘überladen’ und auch auf Float anwendbar D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte Vergleichsoperatoren für ganze Zahlen, d.h. Typ Int -> Int -> Bool: >, >=, ==, / =, <=, < diese Vergleichsoperatoren sind – wie auch die arithmetischen Operatoren – ‘überladen’ und auch auf Float anwendbar Typ dann: Float -> Float -> Bool D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis vordefinierte Vergleichsoperatoren für ganze Zahlen, d.h. Typ Int -> Int -> Bool: >, >=, ==, / =, <=, < diese Vergleichsoperatoren sind – wie auch die arithmetischen Operatoren – ‘überladen’ und auch auf Float anwendbar Typ dann: Float -> Float -> Bool für == gilt auch Bool -> Bool -> Bool bzw. sogar allgemein t -> t -> Bool , sofern für den Typ t Gleichheit definiert (Hinweis: t hier sog. Typvariable) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis einige vordefinierte Operatoren bzw. Konstanten für Float Name(n) + - * / ˆ ** exp log logBase pi signum sqrt cos, sin, tan acos, asin, atan ceiling, floor, round fromInt Typ Float -> Float -> Float Float -> Int -> Float Float -> Float -> Float Float -> Float Float -> Float Float -> Float -> Float Float Float -> Float Float -> Float Float -> Float Float -> Float Float -> Int Int -> Float D. Rösner AuD 2008/2009 . . . Bem. xn xy ex ln x loga x π Rundung Konversion Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operatoren werden infix verwendet, d.h. 3 + 4 aber: Verwendung eines Operatorsymbols <op> in Präfixposition möglich mit Notation (<op>) , d.h. (+) 3 4 == 3 + 4 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operatoren werden infix verwendet, d.h. 3 + 4 aber: Verwendung eines Operatorsymbols <op> in Präfixposition möglich mit Notation (<op>) , d.h. (+) 3 4 == 3 + 4 können assoziativ sein; z.B. +, * D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operatoren werden infix verwendet, d.h. 3 + 4 aber: Verwendung eines Operatorsymbols <op> in Präfixposition möglich mit Notation (<op>) , d.h. (+) 3 4 == 3 + 4 können assoziativ sein; z.B. +, * nicht-assoziative Operatoren werden festgelegt als links-assoziativ oder rechts-assoziativ z.B. - links-assoziativ, d.h. a - b - c == (a - b) - c D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operatoren werden infix verwendet, d.h. 3 + 4 aber: Verwendung eines Operatorsymbols <op> in Präfixposition möglich mit Notation (<op>) , d.h. (+) 3 4 == 3 + 4 können assoziativ sein; z.B. +, * nicht-assoziative Operatoren werden festgelegt als links-assoziativ oder rechts-assoziativ z.B. - links-assoziativ, d.h. a - b - c == (a - b) - c Operatoren haben Bindungsstärke oder Fixität (engl. fixity) z.B. * hat Fixität 7, + hat 6, ˆ hat 8, daher a + b * c == a + (b * c) und a ˆ b * c == (a ˆ b) * c D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operatoren und Funktionen Funktionsanwendung hat höchste Bindungsstärke D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operatoren und Funktionen Funktionsanwendung hat höchste Bindungsstärke allgemeine Schreibweise: Funktionsname vor Argument(e) f v1 v2 ...vn D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operatoren und Funktionen Funktionsanwendung hat höchste Bindungsstärke allgemeine Schreibweise: Funktionsname vor Argument(e) f v1 v2 ...vn Beachte: da Funktionsanwendung höhere Bindung als jeder andere Operator, wird f n+1 interpretiert als (f n)+1 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operatoren und Funktionen Funktionsanwendung hat höchste Bindungsstärke allgemeine Schreibweise: Funktionsname vor Argument(e) f v1 v2 ...vn Beachte: da Funktionsanwendung höhere Bindung als jeder andere Operator, wird f n+1 interpretiert als (f n)+1 für andere Interpretation ist explizite Klammerung notwendig: f (n+1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Konversionen von Operatoren und Funktionen werden Infix-Operatoren in Klammern eingeschlossen, so können sie als Funktionen vor ihren Argumenten verwendet werden Beispiel: (+) :: Int -> Int -> Int Verwendung: (+) a b == a + b D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Konversionen von Operatoren und Funktionen werden Infix-Operatoren in Klammern eingeschlossen, so können sie als Funktionen vor ihren Argumenten verwendet werden Beispiel: (+) :: Int -> Int -> Int Verwendung: (+) a b == a + b Funktionen können zu Operatoren gemacht werden durch Einschluss des Funktionsnamen in sog. Backquotes a ‘max‘ b == max a b D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: Was ist die wichtigste Fähigkeit, die in einem Studium der Informatik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: Was ist die wichtigste Fähigkeit, die in einem Studium der Informatik oder Wirtschaftsinformatik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: Was ist die wichtigste Fähigkeit, die in einem Studium der Informatik oder Wirtschaftsinformatik oder Computervisualistik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: Was ist die wichtigste Fähigkeit, die in einem Studium der Informatik oder Wirtschaftsinformatik oder Computervisualistik oder Computer Systems Engineering/Ingenieurinformatik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: Was ist die wichtigste Fähigkeit, die in einem Studium der Informatik oder Wirtschaftsinformatik oder Computervisualistik oder Computer Systems Engineering/Ingenieurinformatik oder vergleichbarer Studiengänge D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: Was ist die wichtigste Fähigkeit, die in einem Studium der Informatik oder Wirtschaftsinformatik oder Computervisualistik oder Computer Systems Engineering/Ingenieurinformatik oder vergleichbarer Studiengänge erworben und ausgebaut werden sollte? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: Was ist die wichtigste Fähigkeit, die in einem Studium der Informatik oder Wirtschaftsinformatik oder Computervisualistik oder Computer Systems Engineering/Ingenieurinformatik oder vergleichbarer Studiengänge erworben und ausgebaut werden sollte? mögliche Antwort: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: Was ist die wichtigste Fähigkeit, die in einem Studium der Informatik oder Wirtschaftsinformatik oder Computervisualistik oder Computer Systems Engineering/Ingenieurinformatik oder vergleichbarer Studiengänge erworben und ausgebaut werden sollte? mögliche Antwort: Fähigkeit, für (viele) Probleme Lösungen finden zu können D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Frage: Was ist die wichtigste Fähigkeit, die in einem Studium der Informatik oder Wirtschaftsinformatik oder Computervisualistik oder Computer Systems Engineering/Ingenieurinformatik oder vergleichbarer Studiengänge erworben und ausgebaut werden sollte? mögliche Antwort: Fähigkeit, für (viele) Probleme Lösungen finden zu können Problemlösungen dabei in Form von Algorithmen, die dann in ausführbare Programme umgesetzt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Algorithmus ist einer der zentralen Begriffe der Informatik D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Algorithmus ist einer der zentralen Begriffe der Informatik Algorithmen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Algorithmus ist einer der zentralen Begriffe der Informatik Algorithmen: gibt es auch unabhängig von Computern D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Algorithmus ist einer der zentralen Begriffe der Informatik Algorithmen: gibt es auch unabhängig von Computern gibt es schon seit tausenden von Jahren D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Algorithmus ist einer der zentralen Begriffe der Informatik Algorithmen: gibt es auch unabhängig von Computern gibt es schon seit tausenden von Jahren Bezeichnung ’Algorithmus’ ist vom Namen des persischen Gelehrten Muhammed Al Chwarizimi (etwa 783 bis 850) abgeleitet (s.a. [PD08]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Algorithmen (zumindest in einem intuitiven Sinne) begegnen uns auch im Alltag: s.a. [SS02] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Algorithmen (zumindest in einem intuitiven Sinne) begegnen uns auch im Alltag: Kochrezepte s.a. [SS02] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Algorithmen (zumindest in einem intuitiven Sinne) begegnen uns auch im Alltag: Kochrezepte Bau- und Montageanleitungen s.a. [SS02] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Algorithmen (zumindest in einem intuitiven Sinne) begegnen uns auch im Alltag: Kochrezepte Bau- und Montageanleitungen Betriebsanleitungen s.a. [SS02] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus eine intuitive Begriffsbestimmung für Algorithmus (vgl. [SS02]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus eine intuitive Begriffsbestimmung für Algorithmus (vgl. [SS02]) Ein Algorithmus ist eine präzise (d.h. in einer festgelegten Sprache abgefasste) endliche Beschreibung eines allgemeinen Verfahrens unter Verwendung ausführbarer elementarer (Verarbeitungs-)Schritte. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Auf EUKLID (≈ 300 v. Chr.) geht ein Algorithmus zur Bestimmung des grössten gemeinsamen Teiler (ggT) zweier nicht negativer ganzer Zahlen zurück. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Auf EUKLID (≈ 300 v. Chr.) geht ein Algorithmus zur Bestimmung des grössten gemeinsamen Teiler (ggT) zweier nicht negativer ganzer Zahlen zurück. Der ggT von x und y ist definiert als diejenige Zahl z, für die gilt: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Auf EUKLID (≈ 300 v. Chr.) geht ein Algorithmus zur Bestimmung des grössten gemeinsamen Teiler (ggT) zweier nicht negativer ganzer Zahlen zurück. Der ggT von x und y ist definiert als diejenige Zahl z, für die gilt: z ist Teiler von x, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Auf EUKLID (≈ 300 v. Chr.) geht ein Algorithmus zur Bestimmung des grössten gemeinsamen Teiler (ggT) zweier nicht negativer ganzer Zahlen zurück. Der ggT von x und y ist definiert als diejenige Zahl z, für die gilt: z ist Teiler von x, z ist Teiler von y und D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Auf EUKLID (≈ 300 v. Chr.) geht ein Algorithmus zur Bestimmung des grössten gemeinsamen Teiler (ggT) zweier nicht negativer ganzer Zahlen zurück. Der ggT von x und y ist definiert als diejenige Zahl z, für die gilt: z ist Teiler von x, z ist Teiler von y und für jedes z’ mit D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Auf EUKLID (≈ 300 v. Chr.) geht ein Algorithmus zur Bestimmung des grössten gemeinsamen Teiler (ggT) zweier nicht negativer ganzer Zahlen zurück. Der ggT von x und y ist definiert als diejenige Zahl z, für die gilt: z ist Teiler von x, z ist Teiler von y und für jedes z’ mit z’ Teiler von x und z’ Teiler von y gilt: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Auf EUKLID (≈ 300 v. Chr.) geht ein Algorithmus zur Bestimmung des grössten gemeinsamen Teiler (ggT) zweier nicht negativer ganzer Zahlen zurück. Der ggT von x und y ist definiert als diejenige Zahl z, für die gilt: z ist Teiler von x, z ist Teiler von y und für jedes z’ mit z’ Teiler von x und z’ Teiler von y gilt: z’ ≤ z D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Eine Möglichkeit zum Bestimmen des ggT (x, y): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Eine Möglichkeit zum Bestimmen des ggT (x, y): Bestimme die Primfaktorzerlegung von x und von y und bilde das Produkt derjenigen Primfaktoren, die sowohl in der Faktorzerlegung von x wie in der von y vorkommen. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Eine Möglichkeit zum Bestimmen des ggT (x, y): Bestimme die Primfaktorzerlegung von x und von y und bilde das Produkt derjenigen Primfaktoren, die sowohl in der Faktorzerlegung von x wie in der von y vorkommen. EUKLIDs Algorithmus ist ‘einfacher’ und eleganter. Er nutzt die folgenden Beziehungen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Eine Möglichkeit zum Bestimmen des ggT (x, y): Bestimme die Primfaktorzerlegung von x und von y und bilde das Produkt derjenigen Primfaktoren, die sowohl in der Faktorzerlegung von x wie in der von y vorkommen. EUKLIDs Algorithmus ist ‘einfacher’ und eleganter. Er nutzt die folgenden Beziehungen: ggT(x, y) = ggT(y, Rest von x/y) falls y > 0 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Eine Möglichkeit zum Bestimmen des ggT (x, y): Bestimme die Primfaktorzerlegung von x und von y und bilde das Produkt derjenigen Primfaktoren, die sowohl in der Faktorzerlegung von x wie in der von y vorkommen. EUKLIDs Algorithmus ist ‘einfacher’ und eleganter. Er nutzt die folgenden Beziehungen: ggT(x, y) = ggT(y, Rest von x/y) falls y > 0 ggT(x, y) = x falls y = 0 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Fragen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Fragen: Terminiert der Algorithmus immer? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Fragen: Terminiert der Algorithmus immer? Warum? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Fragen: Terminiert der Algorithmus immer? Warum? Wird immer der richtige Wert berechnet? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Fragen: Terminiert der Algorithmus immer? Warum? Wird immer der richtige Wert berechnet? m.a.W.: Ist der Algorithmus korrekt? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus Fragen: Terminiert der Algorithmus immer? Warum? Wird immer der richtige Wert berechnet? m.a.W.: Ist der Algorithmus korrekt? Hilft Testen beim Beantworten dieser Frage? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus eine mögliche Realisierung in Haskell: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus eine mögliche Realisierung in Haskell: ggT :: Int -> Int -> Int ggT x y = if y > 0 then ggT y (rem x y) else if y == 0 then x else error "ggT: Argument y darf nicht negativ sein" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus eine mögliche Realisierung in Haskell: ggT :: Int -> Int -> Int ggT x y = if y > 0 then ggT y (rem x y) else if y == 0 then x else error "ggT: Argument y darf nicht negativ sein" einige Beispiele für Verwendung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus eine mögliche Realisierung in Haskell: ggT :: Int -> Int -> Int ggT x y = if y > 0 then ggT y (rem x y) else if y == 0 then x else error "ggT: Argument y darf nicht negativ sein" einige Beispiele für Verwendung: Main> ggT 69 81 3 Main> ggT 43 101 1 Main> ggT 69 23 23 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus alternative Realisierung mit Wächtern (guards): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus alternative Realisierung mit Wächtern (guards): ggT’ :: Int -> Int -> Int ggT’ | | | x y y > 0 = ggT’ y (rem x y) y == 0 = x otherwise = error "ggT’: Argument y darf nicht negativ sein" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus alternative Realisierung mit Wächtern (guards): ggT’ :: Int -> Int -> Int ggT’ | | | x y y > 0 = ggT’ y (rem x y) y == 0 = x otherwise = error "ggT’: Argument y darf nicht negativ sein" Bedingungen der Wächter werden nacheinander (von oben nach unten) überprüft D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus alternative Realisierung mit Wächtern (guards): ggT’ :: Int -> Int -> Int ggT’ | | | x y y > 0 = ggT’ y (rem x y) y == 0 = x otherwise = error "ggT’: Argument y darf nicht negativ sein" Bedingungen der Wächter werden nacheinander (von oben nach unten) überprüft sobald eine erfüllt ist, wird ihre rechte Seite (nach =) ausgewertet und ergibt den Wert D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis EUKLIDs Algorithmus alternative Realisierung mit Wächtern (guards): ggT’ :: Int -> Int -> Int ggT’ | | | x y y > 0 = ggT’ y (rem x y) y == 0 = x otherwise = error "ggT’: Argument y darf nicht negativ sein" Bedingungen der Wächter werden nacheinander (von oben nach unten) überprüft sobald eine erfüllt ist, wird ihre rechte Seite (nach =) ausgewertet und ergibt den Wert otherwise als letzter Wächter trifft immer zu (sog. catch all-Bedingung) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) zur Erinnerung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) zur Erinnerung: Definition: Eine natürliche Zahl n (n > 1) ist genau dann Primzahl, wenn sie nur durch sich selbst und durch 1 teilbar ist. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) zur Erinnerung: Definition: Eine natürliche Zahl n (n > 1) ist genau dann Primzahl, wenn sie nur durch sich selbst und durch 1 teilbar ist. Beispiele: prim oder nicht prim? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) zur Erinnerung: Definition: Eine natürliche Zahl n (n > 1) ist genau dann Primzahl, wenn sie nur durch sich selbst und durch 1 teilbar ist. Beispiele: prim oder nicht prim? 2 ist . . . D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) zur Erinnerung: Definition: Eine natürliche Zahl n (n > 1) ist genau dann Primzahl, wenn sie nur durch sich selbst und durch 1 teilbar ist. Beispiele: prim oder nicht prim? 2 ist . . . 3 ist . . . D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) zur Erinnerung: Definition: Eine natürliche Zahl n (n > 1) ist genau dann Primzahl, wenn sie nur durch sich selbst und durch 1 teilbar ist. Beispiele: prim oder nicht prim? 2 ist . . . 3 ist . . . alle geraden Zahlen grösser 2 sind . . . D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) zur Erinnerung: Definition: Eine natürliche Zahl n (n > 1) ist genau dann Primzahl, wenn sie nur durch sich selbst und durch 1 teilbar ist. Beispiele: prim oder nicht prim? 2 ist . . . 3 ist . . . alle geraden Zahlen grösser 2 sind . . . 31 ist . . . D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) zur Erinnerung: Definition: Eine natürliche Zahl n (n > 1) ist genau dann Primzahl, wenn sie nur durch sich selbst und durch 1 teilbar ist. Beispiele: prim oder nicht prim? 2 ist . . . 3 ist . . . alle geraden Zahlen grösser 2 sind . . . 31 ist . . . 51 ist . . . D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Primzahlen . . . z.B. wichtig für bestimmte Verschlüsselungsverfahren im folgenden werden Varianten eines Primzahltest entwickelt (s.a. [SS02], p. 65) zur Erinnerung: Definition: Eine natürliche Zahl n (n > 1) ist genau dann Primzahl, wenn sie nur durch sich selbst und durch 1 teilbar ist. Beispiele: prim oder nicht prim? 2 ist . . . 3 ist . . . alle geraden Zahlen grösser 2 sind . . . 31 ist . . . 51 ist . . . ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest erster Schritt: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest erster Schritt: Test auf Teilbarkeit: istTeilerVon :: Int -> Int -> Bool istTeilerVon cand zahl = mod zahl cand == 0 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest erster Schritt: Test auf Teilbarkeit: istTeilerVon :: Int -> Int -> Bool istTeilerVon cand zahl = mod zahl cand == 0 Beispiele für Verwendung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest erster Schritt: Test auf Teilbarkeit: istTeilerVon :: Int -> Int -> Bool istTeilerVon cand zahl = mod zahl cand == 0 Beispiele für Verwendung: Main> 5 ‘istTeilerVon‘ 20 True Main> istTeilerVon 7 15 False Main> istTeilerVon 7 63 True D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest erste Version des Algorithmus: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest erste Version des Algorithmus: Um zu entscheiden, ob n > 1 Primzahl, teste, ob n durch irgendeine Zahl m mit 2 <= m < n teilbar. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest erste Version des Algorithmus: Um zu entscheiden, ob n > 1 Primzahl, teste, ob n durch irgendeine Zahl m mit 2 <= m < n teilbar. Wenn dies zutrifft, dann ist n nicht prim, andernfalls ist n prim. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest erste Version des Algorithmus: Um zu entscheiden, ob n > 1 Primzahl, teste, ob n durch irgendeine Zahl m mit 2 <= m < n teilbar. Wenn dies zutrifft, dann ist n nicht prim, andernfalls ist n prim. realisiert mit einer Hilfsfunktion: istPrim :: Int -> Bool istPrim n = if n <= 1 then False else primtest 2 n primtest m n = if m >= n then True else if istTeilerVon m n then False else primtest (m + 1) n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 1 funktioniert (d.h. ist effektiv), ist aber nicht effizient genug D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 1 funktioniert (d.h. ist effektiv), ist aber nicht effizient genug verbesserte Variante: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 1 funktioniert (d.h. ist effektiv), ist aber nicht effizient genug verbesserte Variante: Ziel: unnötigen Aufwand vermeiden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 1 funktioniert (d.h. ist effektiv), ist aber nicht effizient genug verbesserte Variante: Ziel: unnötigen Aufwand vermeiden es brauchen nur m = 2 und dann nur noch ungerade m getestet werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 1 funktioniert (d.h. ist effektiv), ist aber nicht effizient genug verbesserte Variante: Ziel: unnötigen Aufwand vermeiden es brauchen nur m = 2 und dann nur noch ungerade m getestet werden es braucht auch nicht bis m = n getestet zu werden, sondern es reicht zu testen, solange m*m <= n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 1 funktioniert (d.h. ist effektiv), ist aber nicht effizient genug verbesserte Variante: Ziel: unnötigen Aufwand vermeiden es brauchen nur m = 2 und dann nur noch ungerade m getestet werden es braucht auch nicht bis m = n getestet zu werden, sondern es reicht zu testen, solange m*m <= n Mit beiden Veränderungen lässt sich der Aufwand deutlich verringern. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 1 funktioniert (d.h. ist effektiv), ist aber nicht effizient genug verbesserte Variante: Ziel: unnötigen Aufwand vermeiden es brauchen nur m = 2 und dann nur noch ungerade m getestet werden es braucht auch nicht bis m = n getestet zu werden, sondern es reicht zu testen, solange m*m <= n Mit beiden Veränderungen lässt sich der Aufwand deutlich verringern. Motto (manchmal): Make it work, then make it fast! D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 2: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 2: istPrim’ :: Int -> Bool istPrim’ n = if n <= 1 || (n > 2 && istTeilerVon 2 n) then False else primtest 3 where primtest m = if m * m > n then True else if istTeilerVon m n then False else primtest (m + 2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 2: istPrim’ :: Int -> Bool istPrim’ n = if n <= 1 || (n > 2 && istTeilerVon 2 n) then False else primtest 3 where primtest m = if m * m > n then True else if istTeilerVon m n then False else primtest (m + 2) Hinweis: primtest ist hier lokale Definition (nach where), d.h. nur innerhalb von istPrim’ sichtbar D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest Variante 2: istPrim’ :: Int -> Bool istPrim’ n = if n <= 1 || (n > 2 && istTeilerVon 2 n) then False else primtest 3 where primtest m = if m * m > n then True else if istTeilerVon m n then False else primtest (m + 2) Hinweis: primtest ist hier lokale Definition (nach where), d.h. nur innerhalb von istPrim’ sichtbar n ist innerhalb von primtest ’sichtbar’ und braucht daher nicht als Parameter übergeben zu werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest weitere Variante: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest weitere Variante: istPrim’’ :: Int -> Bool istPrim’’ n = if n <= 1 then False else primtest 2 where primtest m = if m * m > n then True else if istTeilerVon m n then False else primtest (if (m==2) then (m+1) else (m+2)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest weitere Variante: istPrim’’ :: Int -> Bool istPrim’’ n = if n <= 1 then False else primtest 2 where primtest m = if m * m > n then True else if istTeilerVon m n then False else primtest (if (m==2) then (m+1) else (m+2)) Hinweis: der letzte else-Zweig in primtest könnte gleichwertig auch wie folgt lauten: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algorithmus Primzahltest weitere Variante: istPrim’’ :: Int -> Bool istPrim’’ n = if n <= 1 then False else primtest 2 where primtest m = if m * m > n then True else if istTeilerVon m n then False else primtest (if (m==2) then (m+1) else (m+2)) Hinweis: der letzte else-Zweig in primtest könnte gleichwertig auch wie folgt lauten: ... else if istTeilerVon m n then False else if (m==2) then primtest (m+1) else primtest (m + 2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listen in Haskell: Listen . . . Zusammenfassung beliebig vieler Elemente vom selben Typ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listen in Haskell: Listen . . . Zusammenfassung beliebig vieler Elemente vom selben Typ Darstellung des Listentyp: [<typ>], D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listen in Haskell: Listen . . . Zusammenfassung beliebig vieler Elemente vom selben Typ Darstellung des Listentyp: [<typ>], z.B. [Int], [Char], [[Int]], [(Name, Matrnr)], ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listen in Haskell: Listen . . . Zusammenfassung beliebig vieler Elemente vom selben Typ Darstellung des Listentyp: [<typ>], z.B. [Int], [Char], [[Int]], [(Name, Matrnr)], ... Listen werden – sofern ungleich der leeren Liste [] - durch Anwendung des Konstruktors ‘:’ (sprich: cons) in eindeutiger Weise ausgehend von [] aufgebaut D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listen in Haskell: Listen . . . Zusammenfassung beliebig vieler Elemente vom selben Typ Darstellung des Listentyp: [<typ>], z.B. [Int], [Char], [[Int]], [(Name, Matrnr)], ... Listen werden – sofern ungleich der leeren Liste [] - durch Anwendung des Konstruktors ‘:’ (sprich: cons) in eindeutiger Weise ausgehend von [] aufgebaut Beispiel: [4,2,3] == 4:2:3:[] == 4:(2:(3:[])) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listen in Haskell: Listen . . . Zusammenfassung beliebig vieler Elemente vom selben Typ Darstellung des Listentyp: [<typ>], z.B. [Int], [Char], [[Int]], [(Name, Matrnr)], ... Listen werden – sofern ungleich der leeren Liste [] - durch Anwendung des Konstruktors ‘:’ (sprich: cons) in eindeutiger Weise ausgehend von [] aufgebaut Beispiel: [4,2,3] == 4:2:3:[] == 4:(2:(3:[])) ‘:’ ist rechts-assoziativ, d.h. x:y:zs == x:(y:zs) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen auch ‘tail recursion’ genannt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen auch ‘tail recursion’ genannt Definition durch D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen auch ‘tail recursion’ genannt Definition durch Angabe des Ausgangswerts für [] und D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen auch ‘tail recursion’ genannt Definition durch Angabe des Ausgangswerts für [] und Angabe, wie von Wert für xs auf Wert von (x:xs) übergegangen wird D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen auch ‘tail recursion’ genannt Definition durch Angabe des Ausgangswerts für [] und Angabe, wie von Wert für xs auf Wert von (x:xs) übergegangen wird Beispiel: Bestimmung der Länge einer Liste length [] = 0 length (x:xs) = 1 + length xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen Beachte: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen Beachte: length ist polymorph, d.h. auf Listen unterschiedlichen Typs anwendbar: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen Beachte: length ist polymorph, d.h. auf Listen unterschiedlichen Typs anwendbar: length :: [a] -> Int D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen Beachte: length ist polymorph, d.h. auf Listen unterschiedlichen Typs anwendbar: length :: [a] -> Int ’wildcard’ in der zweiten Gleichung der Definition möglich, d.h. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen Beachte: length ist polymorph, d.h. auf Listen unterschiedlichen Typs anwendbar: length :: [a] -> Int ’wildcard’ in der zweiten Gleichung der Definition möglich, d.h. length (_:xs) = 1 + length xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Primitive Rekursion über Listen Beachte: length ist polymorph, d.h. auf Listen unterschiedlichen Typs anwendbar: length :: [a] -> Int ’wildcard’ in der zweiten Gleichung der Definition möglich, d.h. length (_:xs) = 1 + length xs length ist wie viele andere Funktionen auf Listen im sog. Standard-Prelude von Haskell bereits vordefiniert D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Rekursion über Listen cont. Beispiel: Summe der Werte der Listenelemente sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Rekursion über Listen cont. Beispiel: Summe der Werte der Listenelemente sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum xs Frage: sum [2, 4 .. 11] ,→ . . . ? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Rekursion über Listen cont. Beispiel: Summe der Werte der Listenelemente sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum xs Frage: sum [2, 4 .. 11] ,→ . . . ? sum ist vordefiniert und polymorph Prelude> :t sum sum :: Num a => [a] -> a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Rekursion über Listen cont. Beispiel: Sortieren mit sog. Insertion-Sort D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Rekursion über Listen cont. Beispiel: Sortieren mit sog. Insertion-Sort iSort :: [Int] -> [Int] iSort [] iSort (x:xs) = [] = ins x (iSort xs) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Rekursion über Listen cont. Beispiel: Sortieren mit sog. Insertion-Sort iSort :: [Int] -> [Int] iSort [] iSort (x:xs) = [] = ins x (iSort xs) ins :: Int -> [Int] -> [Int] ins ins | | x [] = [x] x (y:ys) x<= y = x:(y:ys) otherwise = y: ins x ys D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String Spezialfall: Liste aus Zeichen, d.h. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String Spezialfall: Liste aus Zeichen, d.h. type String = [Char] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String Spezialfall: Liste aus Zeichen, d.h. type String = [Char] alle polymorphen Listenfunktionen können für String benutzt werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String Spezialfall: Liste aus Zeichen, d.h. type String = [Char] alle polymorphen Listenfunktionen können für String benutzt werden Ausgabe mit putStr D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String Spezialfall: Liste aus Zeichen, d.h. type String = [Char] alle polymorphen Listenfunktionen können für String benutzt werden Ausgabe mit putStr putStr :: String -> IO () D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String Spezialfall: Liste aus Zeichen, d.h. type String = [Char] alle polymorphen Listenfunktionen können für String benutzt werden Ausgabe mit putStr putStr :: String -> IO () Wechsel zwischen Strings und Werten: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String Spezialfall: Liste aus Zeichen, d.h. type String = [Char] alle polymorphen Listenfunktionen können für String benutzt werden Ausgabe mit putStr putStr :: String -> IO () Wechsel zwischen Strings und Werten: show (2 + 3) ==> "5" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String Spezialfall: Liste aus Zeichen, d.h. type String = [Char] alle polymorphen Listenfunktionen können für String benutzt werden Ausgabe mit putStr putStr :: String -> IO () Wechsel zwischen Strings und Werten: show (2 + 3) ==> "5" umgekehrt: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String Spezialfall: Liste aus Zeichen, d.h. type String = [Char] alle polymorphen Listenfunktionen können für String benutzt werden Ausgabe mit putStr putStr :: String -> IO () Wechsel zwischen Strings und Werten: show (2 + 3) ==> "5" umgekehrt: (read "True") :: Bool ==> True D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... Prelude> tail "wort" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... Prelude> tail "wort" ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... Prelude> tail "wort" ... Prelude> length "wort" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... Prelude> tail "wort" ... Prelude> length "wort" ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... Prelude> tail "wort" ... Prelude> length "wort" ... Prelude> init "wort" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... Prelude> tail "wort" ... Prelude> length "wort" ... Prelude> init "wort" ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... Prelude> tail "wort" ... Prelude> length "wort" ... Prelude> init "wort" ... Prelude> last "wort" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... Prelude> tail "wort" ... Prelude> length "wort" ... Prelude> init "wort" ... Prelude> last "wort" ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Der Typ String alle polymorphen Listenfunktionen können für String benutzt werden Prelude> "ein " ++ "konkatenierter String" ... Prelude> head "wort" ... Prelude> tail "wort" ... Prelude> length "wort" ... Prelude> init "wort" ... Prelude> last "wort" ... ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung von Listen für Listen von Zahlen, Zeichen und anderen Aufzählungstypen gibt es Kurzschreibweisen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung von Listen für Listen von Zahlen, Zeichen und anderen Aufzählungstypen gibt es Kurzschreibweisen [n .. m] Kurzform für [n,n+1,...,m] (falls m kleiner als n ist Liste leer) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung von Listen für Listen von Zahlen, Zeichen und anderen Aufzählungstypen gibt es Kurzschreibweisen [n .. m] Kurzform für [n,n+1,...,m] (falls m kleiner als n ist Liste leer) Beispiele: [3 .. 9] [1.2 .. 4.1] [’f’ .. ’q’] == [3,4,5,6,7,8,9] == [1.2,2.2,3.2] == "fghijklmnopq" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung von Listen Variante: die ‘Differenz’ zwischen dem zweiten und dem ersten Element ergibt die ‘Schrittweite’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung von Listen Variante: die ‘Differenz’ zwischen dem zweiten und dem ersten Element ergibt die ‘Schrittweite’ Beispiele: [3,5 .. 14] [0.0,0.4 .. 2.0] [’f’,’h’ .. ’q’] = [3,5,7,9,11,13] = [0.0,0.4,0.8,1.2,1.6,2.0] = "fhjlnp" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension Vorbild: math. Notation für Mengen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension Vorbild: math. Notation für Mengen Beispiel: Teiler(n) = {i∈Nk i≤n, i Teiler von n} D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension Vorbild: math. Notation für Mengen Beispiel: Teiler(n) = {i∈Nk i≤n, i Teiler von n} in Haskell: teiler :: Int -> [Int] teiler n = [ i | i<-[1..n], mod n i == 0] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension Vorbild: math. Notation für Mengen Beispiel: Teiler(n) = {i∈Nk i≤n, i Teiler von n} in Haskell: teiler :: Int -> [Int] teiler n = [ i | i<-[1..n], mod n i == 0] Liste [1..n] wirkt als Generator D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension Vorbild: math. Notation für Mengen Beispiel: Teiler(n) = {i∈Nk i≤n, i Teiler von n} in Haskell: teiler :: Int -> [Int] teiler n = [ i | i<-[1..n], mod n i == 0] Liste [1..n] wirkt als Generator Test mod n i == 0 wählt Elemente aus D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension Vorbild: math. Notation für Mengen Beispiel: Teiler(n) = {i∈Nk i≤n, i Teiler von n} in Haskell: teiler :: Int -> [Int] teiler n = [ i | i<-[1..n], mod n i == 0] Liste [1..n] wirkt als Generator Test mod n i == 0 wählt Elemente aus mehrere Tests in Form boolescher Ausdrücke möglich D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) Sei ex die Liste [2,4,7] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) Sei ex die Liste [2,4,7] [ 2*n | n<-ex] ,→ [4,8,14] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) Sei ex die Liste [2,4,7] [ 2*n | n<-ex] ,→ [4,8,14] lies: ‘Nimm alle 2*n für n aus der Liste ex’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) Sei ex die Liste [2,4,7] [ 2*n | n<-ex] ,→ [4,8,14] lies: ‘Nimm alle 2*n für n aus der Liste ex’ zur Veranschaulichung: Auswertung tabellarisch n 2*n = = 2 4 4 8 7 14 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) Sei isEven definiert: isEven :: Int -> Bool isEven n = (n ‘mod‘ 2 == 0) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) Sei isEven definiert: isEven :: Int -> Bool isEven n = (n ‘mod‘ 2 == 0) [ isEven n | n<-ex] ,→ [True, True, False] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) Sei isEven definiert: isEven :: Int -> Bool isEven n = (n ‘mod‘ 2 == 0) [ isEven n | n<-ex] ,→ [True, True, False] mehrere Tests möglich D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) Sei isEven definiert: isEven :: Int -> Bool isEven n = (n ‘mod‘ 2 == 0) [ isEven n | n<-ex] ,→ [True, True, False] mehrere Tests möglich [ 2*n | n<-ex, isEven n, n>3] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) links von <- können nicht nur Variable, sondern auch Muster (pattern) stehen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) links von <- können nicht nur Variable, sondern auch Muster (pattern) stehen Beispiel: addPairs :: [(Int,Int)] -> [Int] addPairs pairList = [ n+m | (n,m) <- pairList] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Beispiele (vgl. [Tho99], pp.79) links von <- können nicht nur Variable, sondern auch Muster (pattern) stehen Beispiel: addPairs :: [(Int,Int)] -> [Int] addPairs pairList = [ n+m | (n,m) <- pairList] Veranschaulichung mit Tabelle: [ n+m n m n+m | (n,m) <- [(2,3),(2,1),(7,8)]] = 2 2 7 = 3 1 8 = 5 3 15 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont. (vgl. [Tho99], pp.79) zusätzlicher Test: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont. (vgl. [Tho99], pp.79) zusätzlicher Test: nur geordnete Paare addieren addOrdPairs :: [(Int,Int)] -> [Int] addOrdPairs pairList = [ n+m | (n,m) <- pairList, n < m] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont. (vgl. [Tho99], pp.79) zusätzlicher Test: nur geordnete Paare addieren addOrdPairs :: [(Int,Int)] -> [Int] addOrdPairs pairList = [ n+m | (n,m) <- pairList, n < m] Frage: addOrdPairs [(2,3),(2,1),(7,8)] ,→ . . . ? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Syntax: allgemeine Form ist [ e | q1 , ... qk ] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Syntax: allgemeine Form ist [ e | q1 , ... qk ] dabei ist jeder der Qualifikatoren qi D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Syntax: allgemeine Form ist [ e | q1 , ... qk ] dabei ist jeder der Qualifikatoren qi entweder ein Generator der Form p <- lExp D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Syntax: allgemeine Form ist [ e | q1 , ... qk ] dabei ist jeder der Qualifikatoren qi entweder ein Generator der Form p <- lExp mit p Muster und D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Syntax: allgemeine Form ist [ e | q1 , ... qk ] dabei ist jeder der Qualifikatoren qi entweder ein Generator der Form p <- lExp mit p Muster und lExp Ausdruck vom Listentyp D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Syntax: allgemeine Form ist [ e | q1 , ... qk ] dabei ist jeder der Qualifikatoren qi entweder ein Generator der Form p <- lExp mit p Muster und lExp Ausdruck vom Listentyp oder ein Test, d.h. boolescher Ausdruck bExp D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: Syntax: allgemeine Form ist [ e | q1 , ... qk ] dabei ist jeder der Qualifikatoren qi entweder ein Generator der Form p <- lExp mit p Muster und lExp Ausdruck vom Listentyp oder ein Test, d.h. boolescher Ausdruck bExp wichtig: ein Ausdruck lExp bzw. bExp in qi kann auf die in q1 bis qi−1 benutzten Variablen verweisen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont. (vgl. [Tho99], 17.3) mit mehreren Generatoren können Elemente aus zwei oder mehr Listen kombiniert werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont. (vgl. [Tho99], 17.3) mit mehreren Generatoren können Elemente aus zwei oder mehr Listen kombiniert werden Beispiel: pairs :: [a] -> [b] -> [(a,b)] pairs xs ys = [ (x,y) | x<-xs , y<-ys ] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont. (vgl. [Tho99], 17.3) mit mehreren Generatoren können Elemente aus zwei oder mehr Listen kombiniert werden Beispiel: pairs :: [a] -> [b] -> [(a,b)] pairs xs ys = [ (x,y) | x<-xs , y<-ys ] pairs [1,2,3] [4,5] ,→ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont. (vgl. [Tho99], 17.3) mit mehreren Generatoren können Elemente aus zwei oder mehr Listen kombiniert werden Beispiel: pairs :: [a] -> [b] -> [(a,b)] pairs xs ys = [ (x,y) | x<-xs , y<-ys ] pairs [1,2,3] [4,5] ,→ [(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: pythagoräische Tripel: für welche Tripel (x, y , z) ganzer Zahlen gilt: x 2 + y 2 = z2 ? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: pythagoräische Tripel: für welche Tripel (x, y , z) ganzer Zahlen gilt: x 2 + y 2 = z2 ? als Listenkomprehension: pyTriple n = [(x,y,z)| x<-[2 .. n], y<-[x+1 .. n], z<-[y+1 .. n], x*x+y*y==z*z] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Listenkomprehension cont.: pythagoräische Tripel: für welche Tripel (x, y , z) ganzer Zahlen gilt: x 2 + y 2 = z2 ? als Listenkomprehension: pyTriple n = [(x,y,z)| x<-[2 .. n], y<-[x+1 .. n], z<-[y+1 .. n], x*x+y*y==z*z] Frage: pyTriple 100 ,→ ... ? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird eine feste Anzahl von Objekten aggregiert, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird eine feste Anzahl von Objekten aggregiert, die aber von unterschiedlichem Typ sein können D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird eine feste Anzahl von Objekten aggregiert, die aber von unterschiedlichem Typ sein können Beispiele: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird eine feste Anzahl von Objekten aggregiert, die aber von unterschiedlichem Typ sein können Beispiele: Paare . . . (<elem1>,<elem2>) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird eine feste Anzahl von Objekten aggregiert, die aber von unterschiedlichem Typ sein können Beispiele: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird eine feste Anzahl von Objekten aggregiert, die aber von unterschiedlichem Typ sein können Beispiele: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) n-Tupel . . . (<elem1>,<elem2>,...,<elemN>) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird eine feste Anzahl von Objekten aggregiert, die aber von unterschiedlichem Typ sein können Beispiele: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) n-Tupel . . . (<elem1>,<elem2>,...,<elemN>) Unterschied: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird eine feste Anzahl von Objekten aggregiert, die aber von unterschiedlichem Typ sein können Beispiele: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) n-Tupel . . . (<elem1>,<elem2>,...,<elemN>) Unterschied: Liste aggregiert variable Anzahl von Objekten D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird eine feste Anzahl von Objekten aggregiert, die aber von unterschiedlichem Typ sein können Beispiele: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) n-Tupel . . . (<elem1>,<elem2>,...,<elemN>) Unterschied: Liste aggregiert variable Anzahl von Objekten mit identischem Typ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und Matrikelnummer (Typ Int) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und Matrikelnummer (Typ Int) Definition des Tupeltyps Student type Student = (String,Int) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und Matrikelnummer (Typ Int) Definition des Tupeltyps Student type Student = (String,Int) math. Sicht: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und Matrikelnummer (Typ Int) Definition des Tupeltyps Student type Student = (String,Int) math. Sicht: Tupeltyp als Teilmenge des Kreuzprodukts der Komponententypen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Verwendung von Tupeln (vgl. [Tho99], 5.2) es gibt typische Verwendungen für Tupel: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Verwendung von Tupeln (vgl. [Tho99], 5.2) es gibt typische Verwendungen für Tupel: Tupel für zusammengesetzte Resultate von Funktionen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Verwendung von Tupeln (vgl. [Tho99], 5.2) es gibt typische Verwendungen für Tupel: Tupel für zusammengesetzte Resultate von Funktionen Beispiel: minAndMax :: Int -> Int -> (Int, Int) minAndMax x y | x>=y | otherwise = (y,x) = (x,y) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen mit Tupeln Funktionen mit Tupeln D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen mit Tupeln Funktionen mit Tupeln meist mit Pattern matching definiert D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen mit Tupeln Funktionen mit Tupeln meist mit Pattern matching definiert Beispiel: addPair :: (Int, Int) -> Int addPair (x,y) = x+y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen mit Tupeln Funktionen mit Tupeln meist mit Pattern matching definiert Beispiel: addPair :: (Int, Int) -> Int addPair (x,y) = x+y Variante mit vordefinierten Selektorfunktionen für Paare addPair :: (Int, Int) -> Int addPair p = fst p + snd p D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen mit Tupeln mögliche Definition dieser Selektorfunktionen: fst (x,y) = x snd (x,y) = y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen mit Tupeln mögliche Definition dieser Selektorfunktionen: fst (x,y) = x snd (x,y) = y in Prelude.hs: mit wildcards in Muster fst fst (x,_) :: (a,b) -> a = x snd snd (_,y) :: (a,b) -> b = y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: effiziente Berechnung der Fibonacci-Zahlen (vgl. [Tho99], pp. 75]) Idee: Funktion, die zwei aufeinanderfolgende Werte der Folge als Resultat, d.h. gesucht ist fibPair :: Int -> (Int, Int) fibPair n = (fib n, fib (n+1)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: effiziente Berechnung der Fibonacci-Zahlen (vgl. [Tho99], pp. 75]) Idee: Funktion, die zwei aufeinanderfolgende Werte der Folge als Resultat, d.h. gesucht ist fibPair :: Int -> (Int, Int) fibPair n = (fib n, fib (n+1)) aus einem Paar (u,v) ergibt sich das nachfolgende Paar als (v,u+v) über fibStep fibStep :: (Int, Int) -> (Int, Int) fibStep (u,v) = (v,u+v) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: effiziente Berechnung der Fibonacci-Zahlen cont. damit fibPair definierbar als fibPair :: Int -> (Int, Int) fibPair n | n== 0 | otherwise = (0,1) = fibStep (fibPair (n-1)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: effiziente Berechnung der Fibonacci-Zahlen cont. damit fibPair definierbar als fibPair :: Int -> (Int, Int) fibPair n | n== 0 | otherwise = (0,1) = fibStep (fibPair (n-1)) schliesslich: das erste Element des Paars ist das Ergebnis fastFib :: Int -> Int fastFib n = fst(fibPair n) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen mit Tupeln bei Definition von Funktionen auf Tupeln können auch verschachtelte Muster verwendet werden (vgl. [Tho99], 5.2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen mit Tupeln bei Definition von Funktionen auf Tupeln können auch verschachtelte Muster verwendet werden (vgl. [Tho99], 5.2) Beispiel: shift :: ((Int,Int),Int) -> (Int,(Int,Int)) shift ((x,y),z) = (x,(y,z)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwandbetrachtungen: für ein Problem gibt es oft unterschiedlich aufwendige Lösungen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwandbetrachtungen: für ein Problem gibt es oft unterschiedlich aufwendige Lösungen Beispiel: Fibonacci-Zahlen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwandbetrachtungen: für ein Problem gibt es oft unterschiedlich aufwendige Lösungen Beispiel: Fibonacci-Zahlen die Folge der Fibonacci-Zahlen ist definiert durch: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwandbetrachtungen: für ein Problem gibt es oft unterschiedlich aufwendige Lösungen Beispiel: Fibonacci-Zahlen die Folge der Fibonacci-Zahlen ist definiert durch: Anfangswerte: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwandbetrachtungen: für ein Problem gibt es oft unterschiedlich aufwendige Lösungen Beispiel: Fibonacci-Zahlen die Folge der Fibonacci-Zahlen ist definiert durch: Anfangswerte: fib0 = 1, fib1 = 1 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwandbetrachtungen: für ein Problem gibt es oft unterschiedlich aufwendige Lösungen Beispiel: Fibonacci-Zahlen die Folge der Fibonacci-Zahlen ist definiert durch: Anfangswerte: fib0 = 1, fib1 = 1 für alle anderen Werte (d.h. für n ≥ 2) gilt die folgende rekursive Definition: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwandbetrachtungen: für ein Problem gibt es oft unterschiedlich aufwendige Lösungen Beispiel: Fibonacci-Zahlen die Folge der Fibonacci-Zahlen ist definiert durch: Anfangswerte: fib0 = 1, fib1 = 1 für alle anderen Werte (d.h. für n ≥ 2) gilt die folgende rekursive Definition: fibn = fibn−1 + fibn−2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwandbetrachtungen: für ein Problem gibt es oft unterschiedlich aufwendige Lösungen Beispiel: Fibonacci-Zahlen die Folge der Fibonacci-Zahlen ist definiert durch: Anfangswerte: fib0 = 1, fib1 = 1 für alle anderen Werte (d.h. für n ≥ 2) gilt die folgende rekursive Definition: fibn = fibn−1 + fibn−2 die Fibonacci-Zahlen wurden von Leonardo von Pisa (ca. 1170 – 1250; genannt Fibonacci) entwickelt, um u.a. die Vermehrung von Kaninchen-Populationen zu beschreiben D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die Definition der Fibonacci-Zahlen lässt sich direkt in einen rekursiven Algorithmus umsetzen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die Definition der Fibonacci-Zahlen lässt sich direkt in einen rekursiven Algorithmus umsetzen in Haskell: Variante mit Pattern matching fib :: Int -> Int fib 0 = 1 fib 1 = 1 fib n = fib (n - 1) + fib (n - 2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die Werte in der Folge wachsen sehr schnell an D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die Werte in der Folge wachsen sehr schnell an so ergeben sich die ersten 30 Fibonacci-Zahlen als Main> take 30 [(n, fib n)| n <- [0 ..]] [(0,1),(1,1),(2,2),(3,3),(4,5),(5,8),(6,13),(7,21), (8,34),(9,55),(10,89),(11,144),(12,233),(13,377), (14,610),(15,987),(16,1597),(17,2584),(18,4181), (19,6765),(20,10946),(21,17711),(22,28657),(23,46368) (24,75025),(25,121393),(26,196418),(27,317811), (28,514229),(29,832040)] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) ≥ 2 * 2 * aufwand(fib (n - 4)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) ≥ 2 * 2 * aufwand(fib (n - 4)) ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) ≥ 2 * 2 * aufwand(fib (n - 4)) ... für n gerade: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) ≥ 2 * 2 * aufwand(fib (n - 4)) ... für n gerade: ≥ 2(n/2−1) * aufwand(fib 2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) ≥ 2 * 2 * aufwand(fib (n - 4)) ... für n gerade: ≥ 2(n/2−1) * aufwand(fib 2) = 2n/2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) ≥ 2 * 2 * aufwand(fib (n - 4)) ... für n gerade: ≥ 2(n/2−1) * aufwand(fib 2) = 2n/2 analog für n ungerade: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) ≥ 2 * 2 * aufwand(fib (n - 4)) ... für n gerade: ≥ 2(n/2−1) * aufwand(fib 2) = 2n/2 analog für n ungerade: ≥ 2(n−1)/2−1 * aufwand(fib 3) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) ≥ 2 * 2 * aufwand(fib (n - 4)) ... für n gerade: ≥ 2(n/2−1) * aufwand(fib 2) = 2n/2 analog für n ungerade: ≥ 2(n−1)/2−1 * aufwand(fib 3) ≥ 2(n−1)/2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen zusammengefasst: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen zusammengefasst: Aufwand für Berechnung von fib n (hier gemessen in Anzahl von Funktionsaufrufen) wächst in Abhängigkeit von n mindestens so stark wie 2(n−1)/2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung der Fibonacci-Zahlen zusammengefasst: Aufwand für Berechnung von fib n (hier gemessen in Anzahl von Funktionsaufrufen) wächst in Abhängigkeit von n mindestens so stark wie 2(n−1)/2 im Kontrast dazu ist der Aufwand für die Berechnung von fastFib n (vgl. letzte Vorlesung und [Tho99], pp. 75) nur eine lineare Funktion von n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen asymptotischer Vergleich von Funktionen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen asymptotischer Vergleich von Funktionen O (sprich: gross-0) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen asymptotischer Vergleich von Funktionen O (sprich: gross-0) für “asymptotisch kleiner als oder gleich“ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen asymptotischer Vergleich von Funktionen O (sprich: gross-0) für “asymptotisch kleiner als oder gleich“ Seien im folgenden f und g Funktionen von den natürlichen Zahlen in die nichtnegativen reellen Zahlen. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen asymptotischer Vergleich von Funktionen O (sprich: gross-0) für “asymptotisch kleiner als oder gleich“ Seien im folgenden f und g Funktionen von den natürlichen Zahlen in die nichtnegativen reellen Zahlen. Definition (vgl. [GT01], 3.6): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen asymptotischer Vergleich von Funktionen O (sprich: gross-0) für “asymptotisch kleiner als oder gleich“ Seien im folgenden f und g Funktionen von den natürlichen Zahlen in die nichtnegativen reellen Zahlen. Definition (vgl. [GT01], 3.6): f(n) ist O(g(n)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen asymptotischer Vergleich von Funktionen O (sprich: gross-0) für “asymptotisch kleiner als oder gleich“ Seien im folgenden f und g Funktionen von den natürlichen Zahlen in die nichtnegativen reellen Zahlen. Definition (vgl. [GT01], 3.6): f(n) ist O(g(n)) wenn es eine reelle Konstante c > 0 und eine natürliche Zahl n0 ≥ 1 gibt, so dass f(n) ≤ c g(n) für alle n ≥ n0 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Ω (sprich: gross-0mega) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Ω (sprich: gross-0mega) für “asymptotisch grösser als oder gleich“ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Ω (sprich: gross-0mega) für “asymptotisch grösser als oder gleich“ Definition (vgl. [GT01], 3.6): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Ω (sprich: gross-0mega) für “asymptotisch grösser als oder gleich“ Definition (vgl. [GT01], 3.6): f(n) ist Ω(g(n)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Ω (sprich: gross-0mega) für “asymptotisch grösser als oder gleich“ Definition (vgl. [GT01], 3.6): f(n) ist Ω(g(n)) wenn g(n) ist O(f(n)) d.h. es gibt eine reelle Konstante c > 0 und eine natürliche Zahl n0 ≥ 1, so dass f(n) ≥ c g(n) für alle n ≥ n0 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Θ (sprich: gross-Theta) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Θ (sprich: gross-Theta) für “asymptotisch gleich“ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Θ (sprich: gross-Theta) für “asymptotisch gleich“ Definition (vgl. [GT01], 3.6): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Θ (sprich: gross-Theta) für “asymptotisch gleich“ Definition (vgl. [GT01], 3.6): f(n) ist Θ(g(n)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Θ (sprich: gross-Theta) für “asymptotisch gleich“ Definition (vgl. [GT01], 3.6): f(n) ist Θ(g(n)) wenn D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Θ (sprich: gross-Theta) für “asymptotisch gleich“ Definition (vgl. [GT01], 3.6): f(n) ist Θ(g(n)) wenn f(n) ist O(g(n)) und D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Θ (sprich: gross-Theta) für “asymptotisch gleich“ Definition (vgl. [GT01], 3.6): f(n) ist Θ(g(n)) wenn f(n) ist O(g(n)) und f(n) ist Ω(g(n)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Θ (sprich: gross-Theta) für “asymptotisch gleich“ Definition (vgl. [GT01], 3.6): f(n) ist Θ(g(n)) wenn f(n) ist O(g(n)) und f(n) ist Ω(g(n)) m.a.W. es gibt reelle Konstanten c > 0 und d > 0 und eine natürliche Zahl n0 ≥ 1, so dass c g(n) ≤ f(n) ≤ d g(n) für alle n ≥ n0 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): 20 n3 + 10 n log n + 5 ist O(n3 ) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): 20 n3 + 10 n log n + 5 ist O(n3 ) Begründung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): 20 n3 + 10 n log n + 5 ist O(n3 ) Begründung: für n ≥ 1 : log n < n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): 20 n3 + 10 n log n + 5 ist O(n3 ) Begründung: für n ≥ 1 : log n < n n log n < n2 ≤ n3 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): 20 n3 + 10 n log n + 5 ist O(n3 ) Begründung: für n ≥ 1 : log n < n n log n < n2 ≤ n3 10 n log n ≤ 10 n3 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): 20 n3 + 10 n log n + 5 ist O(n3 ) Begründung: für n ≥ 1 : log n < n n log n < n2 ≤ n3 10 n log n ≤ 10 n3 Damit: 20 n3 + 10 n log n + 5 ≤ 35 n3 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): jedes Polynom ak nk + ak −1 nk −1 + . . . + a0 ist O(nk ) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): jedes Polynom ak nk + ak −1 nk −1 + . . . + a0 ist O(nk ) 3 log n + log log n ist O(log n) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): jedes Polynom ak nk + ak −1 nk −1 + . . . + a0 ist O(nk ) 3 log n + log log n ist O(log n) Begründung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): jedes Polynom ak nk + ak −1 nk −1 + . . . + a0 ist O(nk ) 3 log n + log log n ist O(log n) Begründung: für n ≥ 2 : log log n ≤ log n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): jedes Polynom ak nk + ak −1 nk −1 + . . . + a0 ist O(nk ) 3 log n + log log n ist O(log n) Begründung: für n ≥ 2 : log log n ≤ log n Damit: 3 log n + log log n ≤ 4 log n für n ≥ 2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Zugriff auf das erste Listenelement (den Listenkopf) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Zugriff auf das erste Listenelement (den Listenkopf) im Prelude definiert als: head head (x:_) :: [a] -> a = x D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Zugriff auf das erste Listenelement (den Listenkopf) im Prelude definiert als: head head (x:_) :: [a] -> a = x der Aufwand ist unabhängig von der Länge der Liste konstant, d.h. O(1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Test, ob ein Element in einer Liste der Länge n enthalten D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Test, ob ein Element in einer Liste der Länge n enthalten elem elem _ [] elem y (x:xs) :: a -> [a] -> Bool = False = if y == x then True else elem y xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Test, ob ein Element in einer Liste der Länge n enthalten elem elem _ [] elem y (x:xs) :: a -> [a] -> Bool = False = if y == x then True else elem y xs günstigster Fall: y ist gleich dem ersten Listenelement D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Test, ob ein Element in einer Liste der Länge n enthalten elem elem _ [] elem y (x:xs) :: a -> [a] -> Bool = False = if y == x then True else elem y xs günstigster Fall: y ist gleich dem ersten Listenelement schlechtester Fall (sog. “worst case“): y ist überhaupt nicht in der Liste enthalten (oder als letztes Element) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Test, ob ein Element in einer Liste der Länge n enthalten elem elem _ [] elem y (x:xs) :: a -> [a] -> Bool = False = if y == x then True else elem y xs günstigster Fall: y ist gleich dem ersten Listenelement schlechtester Fall (sog. “worst case“): y ist überhaupt nicht in der Liste enthalten (oder als letztes Element) Aufwand (hier z.B. Zahl der rekursiven Aufrufe und der Tests auf Gleichheit) ist linear bezeogen auf n, d.h. O(n) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Schnittbildung zweier Listen, d.h. Bestimmung derjenigen Elemente, die in beiden Listen enthalten D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Schnittbildung zweier Listen, d.h. Bestimmung derjenigen Elemente, die in beiden Listen enthalten intersect intersect _ [] intersect [] _ intersect (x:xs) y :: [a] -> [a] -> [a] = [] = [] = if elem x y then x:(intersect xs y) else (intersect xs y) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Schnittbildung zweier Listen, d.h. Bestimmung derjenigen Elemente, die in beiden Listen enthalten intersect intersect _ [] intersect [] _ intersect (x:xs) y :: [a] -> [a] -> [a] = [] = [] = if elem x y then x:(intersect xs y) else (intersect xs y) schlechtester Fall: die Listen haben keine gemeinsamen Elemente D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Schnittbildung zweier Listen, d.h. Bestimmung derjenigen Elemente, die in beiden Listen enthalten intersect intersect _ [] intersect [] _ intersect (x:xs) y :: [a] -> [a] -> [a] = [] = [] = if elem x y then x:(intersect xs y) else (intersect xs y) schlechtester Fall: die Listen haben keine gemeinsamen Elemente mit m = length (x:xs) und n = length y ergeben sich m mal n Tests auf Enthaltensein D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Aufwand bei Listenfunktionen Schnittbildung zweier Listen, d.h. Bestimmung derjenigen Elemente, die in beiden Listen enthalten intersect intersect _ [] intersect [] _ intersect (x:xs) y :: [a] -> [a] -> [a] = [] = [] = if elem x y then x:(intersect xs y) else (intersect xs y) schlechtester Fall: die Listen haben keine gemeinsamen Elemente mit m = length (x:xs) und n = length y ergeben sich m mal n Tests auf Enthaltensein m.a.W.: Aufwand ist quadratisch, d.h. O(n2 ) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Identifikatoren: Bezeichner von Variablen, von Typen von Funktionen usw. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Identifikatoren: Bezeichner von Variablen, von Typen von Funktionen usw. Identifikatoren müssen in Haskell mit einem Buchstaben beginnen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Identifikatoren: Bezeichner von Variablen, von Typen von Funktionen usw. Identifikatoren müssen in Haskell mit einem Buchstaben beginnen dieser kann von einer beliebigen Sequenz von Buchstaben, Ziffern, Unterstrichen (_) und einzelnen Anführungszeichen gefolgt sein D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Konventionen für führende Großbuchstaben bzw. Kleinbuchstaben D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Konventionen für führende Großbuchstaben bzw. Kleinbuchstaben alle Namen, die in Definitionen von Werten verwendet werden (d.h. also auch alle Funktionsnamen), müssen mit einem kleinen Buchstaben beginnen, ebenso die Bezeichner für Variable und Typvariable D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Konventionen für führende Großbuchstaben bzw. Kleinbuchstaben alle Namen, die in Definitionen von Werten verwendet werden (d.h. also auch alle Funktionsnamen), müssen mit einem kleinen Buchstaben beginnen, ebenso die Bezeichner für Variable und Typvariable Beachte: Verwendung von _ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Konventionen für führende Großbuchstaben bzw. Kleinbuchstaben alle Namen, die in Definitionen von Werten verwendet werden (d.h. also auch alle Funktionsnamen), müssen mit einem kleinen Buchstaben beginnen, ebenso die Bezeichner für Variable und Typvariable Beachte: Verwendung von _ einzeln: . . . D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Konventionen für führende Großbuchstaben bzw. Kleinbuchstaben alle Namen, die in Definitionen von Werten verwendet werden (d.h. also auch alle Funktionsnamen), müssen mit einem kleinen Buchstaben beginnen, ebenso die Bezeichner für Variable und Typvariable Beachte: Verwendung von _ einzeln: . . . als erstes Zeichen gefolgt von Sequenz: . . . D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Konventionen für führende Großbuchstaben bzw. Kleinbuchstaben alle Namen, die in Definitionen von Werten verwendet werden (d.h. also auch alle Funktionsnamen), müssen mit einem kleinen Buchstaben beginnen, ebenso die Bezeichner für Variable und Typvariable Beachte: Verwendung von _ einzeln: . . . als erstes Zeichen gefolgt von Sequenz: . . . mit einem Großbuchstaben beginnen Typnamen (z.B. Int), Konstruktoren, True und False, Modulnamen und auch die Namen von Typklassen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen kleine Sammlung sog. reservierter Wörter D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen kleine Sammlung sog. reservierter Wörter können nicht als Identifikatoren benutzt werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen kleine Sammlung sog. reservierter Wörter können nicht als Identifikatoren benutzt werden dazu zählen: case|class|data|default|deriving|do|else |if|import|in|infix|infixl|infixr|instance |let|module|newtype|of|then|type|where|_ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Empfehlung: mnemonische, ’sprechende’ Namen verwenden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Empfehlung: mnemonische, ’sprechende’ Namen verwenden z.B. zinssatz statt nur z D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Empfehlung: mnemonische, ’sprechende’ Namen verwenden z.B. zinssatz statt nur z Empfehlung: bei Namen, die aus mehreren Worten zusammengesetzt sind, den Beginn des zweiten Worts (und ggf. folgender Wörter) in Großbuchstaben schreiben D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Haskell – lexikalische Konventionen Empfehlung: mnemonische, ’sprechende’ Namen verwenden z.B. zinssatz statt nur z Empfehlung: bei Namen, die aus mehreren Worten zusammengesetzt sind, den Beginn des zweiten Worts (und ggf. folgender Wörter) in Großbuchstaben schreiben z.B. letztesElement D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs Prelude.hs enthält viele nützliche Funktionen /usr/local/hugs98-Dec2001/share/hugs/lib/Prelude.hs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Listenfunktionen: head head (x:_) :: [a] -> a = x last last [x] last (_:xs) :: [a] -> a = x = last xs tail tail (_:xs) :: [a] -> [a] = xs init init [x] init (x:xs) :: [a] -> [a] = [] = x : init xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Listenfunktionen cont. null null [] null (_:_) :: [a] -> Bool = True = False (++) [] ++ ys (x:xs) ++ ys :: [a] -> [a] -> [a] = ys = x : (xs ++ ys) map map f xs :: (a -> b) -> [a] -> [b] = [ f x | x <- xs ] filter filter p xs :: (a -> Bool) -> [a] -> [a] = [ x | x <- xs, p x ] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Listenfunktionen cont. concat concat :: [[a]] -> [a] = foldr (++) [] length length :: [a] -> Int = foldl’ (\n _ -> n + 1) 0 (!!) (x:_) (_:xs) (_:_) [] !! !! !! !! :: [a] -> Int -> a 0 = x n | n>0 = xs !! (n-1) _ = error "Prelude.!!: negative index" _ = error "Prelude.!!: index too large" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs Funktionen, die ein Paar als Argument nehmen, vs. Funktionen mit zwei Argumenten D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs Funktionen, die ein Paar als Argument nehmen, vs. Funktionen mit zwei Argumenten curry curry f x y :: ((a,b) -> c) -> (a -> b -> c) = f (x,y) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs Funktionen, die ein Paar als Argument nehmen, vs. Funktionen mit zwei Argumenten curry curry f x y :: ((a,b) -> c) -> (a -> b -> c) = f (x,y) uncurry uncurry f p :: (a -> b -> c) -> ((a,b) -> c) = f (fst p) (snd p) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs cont. id id x :: a -> a = x const const k _ :: a -> b -> a = k (.) (f . g) x :: (b -> c) -> (a -> b) -> (a -> c) = f (g x) flip flip f x y :: (a -> b -> c) -> b -> a -> c = f y x D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs: Faltung foldl :: (a -> b -> a) -> a -> [b] -> a foldl f z [] = z foldl f z (x:xs) = foldl f (f z x) xs foldr :: (a -> b -> b) -> b -> [a] -> b foldr f z [] = z foldr f z (x:xs) = f x (foldr f z xs) ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs Fehlererzeugung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs Fehlererzeugung: primitive error :: String -> a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs Fehlererzeugung: primitive error :: String -> a Beispiel einer Kontrollstruktur: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Listen Weitere EUKLID Funktionen Primzahltest Datentyp Liste Strings Lis Funktionen in Prelude.hs Fehlererzeugung: primitive error :: String -> a Beispiel einer Kontrollstruktur: until until p f x :: (a -> Bool) -> (a -> a) -> a = if p x then x else until p f ( D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell: Funktionen sind in funktionalen Programmiersprachen ‘Bürger erster Klasse’ (‘first class citizens’) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell: Funktionen sind in funktionalen Programmiersprachen ‘Bürger erster Klasse’ (‘first class citizens’) sie unterscheiden sich nicht von (anderen) Daten, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell: Funktionen sind in funktionalen Programmiersprachen ‘Bürger erster Klasse’ (‘first class citizens’) sie unterscheiden sich nicht von (anderen) Daten, sie können Argumente von Funktionen sein, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell: Funktionen sind in funktionalen Programmiersprachen ‘Bürger erster Klasse’ (‘first class citizens’) sie unterscheiden sich nicht von (anderen) Daten, sie können Argumente von Funktionen sein, sie können Werte von Funktionen sein, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell: Funktionen sind in funktionalen Programmiersprachen ‘Bürger erster Klasse’ (‘first class citizens’) sie unterscheiden sich nicht von (anderen) Daten, sie können Argumente von Funktionen sein, sie können Werte von Funktionen sein, sie können Elemente in zusammengesetzten Datenstrukturen sein (z.B. Listen, Tupel, . . . ). D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operationen mit Funktionen Definition von Funktionen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operationen mit Funktionen Definition von Funktionen Anwendung von Funktionen auf Argumente (Funktionsapplikation) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operationen mit Funktionen Definition von Funktionen Anwendung von Funktionen auf Argumente (Funktionsapplikation) Argumente können verschachtelt wieder Anwendungen von Funktionen auf Argumente sein D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operationen mit Funktionen Definition von Funktionen Anwendung von Funktionen auf Argumente (Funktionsapplikation) Argumente können verschachtelt wieder Anwendungen von Funktionen auf Argumente sein partielle Anwendung von Funktionen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Operationen mit Funktionen Definition von Funktionen Anwendung von Funktionen auf Argumente (Funktionsapplikation) Argumente können verschachtelt wieder Anwendungen von Funktionen auf Argumente sein partielle Anwendung von Funktionen Funktionskomposition D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen Definition von Funktionen mit Gleichungen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen Definition von Funktionen mit Gleichungen dabei bedingte Ausdrücke verwendbar D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen Definition von Funktionen mit Gleichungen dabei bedingte Ausdrücke verwendbar Beispiel max :: Int -> Int -> Int max x y = if x >= y then x else y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen Definition von Funktionen mit Gleichungen dabei bedingte Ausdrücke verwendbar Beispiel max :: Int -> Int -> Int max x y = if x >= y then x else y gegebenenfalls verschachtelte bedingte Ausdrücke D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen Definition von Funktionen mit Gleichungen dabei bedingte Ausdrücke verwendbar Beispiel max :: Int -> Int -> Int max x y = if x >= y then x else y gegebenenfalls verschachtelte bedingte Ausdrücke Beispiel fib :: Int -> Int fib x = if x == 0 then 0 else if x == 1 then 1 else fib (x - 1) + fib (x - 2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Variante mit ‘Wächtern’ (engl. ‘guards’) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Variante mit ‘Wächtern’ (engl. ‘guards’) boolesche Ausdrücke für Fälle in einer Definition D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Variante mit ‘Wächtern’ (engl. ‘guards’) boolesche Ausdrücke für Fälle in einer Definition idealerweise disjunkt und vollständig abdeckend D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Variante mit ‘Wächtern’ (engl. ‘guards’) boolesche Ausdrücke für Fälle in einer Definition idealerweise disjunkt und vollständig abdeckend Beispiel max :: Int -> Int -> Int max x y | x >= y | otherwise = x = y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Beispiele cont.: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Beispiele cont.: Beispiel fib fib | | | :: Int -> Int x x == 0 = 0 x == 1 = 1 x > 1 = fib (x - 1) + fib (x - 2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Beispiele cont.: Beispiel fib fib | | | :: Int -> Int x x == 0 = 0 x == 1 = 1 x > 1 = fib (x - 1) + fib (x - 2) Variante: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Beispiele cont.: Beispiel fib fib | | | :: Int -> Int x x == 0 = 0 x == 1 = 1 x > 1 = fib (x - 1) + fib (x - 2) Variante: Beispiel fib x | x == 0 || x == 1 | otherwise = x = fib (x - 1) + fib (x - 2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Variante mit ‘Pattern matching’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Variante mit ‘Pattern matching’ Beispiel fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib x = fib (x - 1) + fib (x - 2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Variante mit ‘Pattern matching’ Beispiel fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib x = fib (x - 1) + fib (x - 2) Beachte: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Variante mit ‘Pattern matching’ Beispiel fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib x = fib (x - 1) + fib (x - 2) Beachte: Fakt ‘guards’ bzw. Gleichungen werden sequentiell (von oben nach unten) ausgewertet D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. anonyme Variable (wildcards) beim ‘Pattern matching’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. anonyme Variable (wildcards) beim ‘Pattern matching’ Beispiel mistery :: Int -> Int -> Int mistery 0 y = y mistery x y = x D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. anonyme Variable (wildcards) beim ‘Pattern matching’ Beispiel mistery :: Int -> Int -> Int mistery 0 y = y mistery x y = x mit ‘wildcards’: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. anonyme Variable (wildcards) beim ‘Pattern matching’ Beispiel mistery :: Int -> Int -> Int mistery 0 y = y mistery x y = x mit ‘wildcards’: Beispiel mistery :: Int -> Int -> Int mistery 0 y = y mistery x _ = x D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. ‘wildcards’ immer dann sinnvoll, wenn beliebige Werte im Muster (auf der linken Seite) zugelassen werden sollen und auf diese auf der rechten Seite der Gleichung nicht verwiesen werden muss D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Funktionsdefinitionen können wechselseitig aufeinander Bezug nehmen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Funktionsdefinitionen können wechselseitig aufeinander Bezug nehmen Beispiel isEven, isOdd :: Int -> Bool isEven 0 = True isEven 1 = False isEven n = isOdd (n-1) isOdd 0 = False isOdd 1 = True isOdd n = isEven (n-1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition von Funktionen cont. Problem (Warum reichen diese Definitionen nicht?) isEven, isOdd :: Int -> Bool isEven 0 = True isEven n = isOdd (n-1) isOdd 1 = True isOdd n = isEven (n-1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Definition Funktionen sind Funktionen höherer Ordnung, wenn sie D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Definition Funktionen sind Funktionen höherer Ordnung, wenn sie eine Funktion als Argument nehmen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Definition Funktionen sind Funktionen höherer Ordnung, wenn sie eine Funktion als Argument nehmen und/oder D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Definition Funktionen sind Funktionen höherer Ordnung, wenn sie eine Funktion als Argument nehmen und/oder eine Funktion als Wert zurückgeben. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Definition Funktionen sind Funktionen höherer Ordnung, wenn sie eine Funktion als Argument nehmen und/oder eine Funktion als Wert zurückgeben. Funktionen höherer Ordnung (auch Funktionale genannt) dienen der Abstraktion. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Definition Funktionen sind Funktionen höherer Ordnung, wenn sie eine Funktion als Argument nehmen und/oder eine Funktion als Wert zurückgeben. Funktionen höherer Ordnung (auch Funktionale genannt) dienen der Abstraktion. Wiederkehrende Programmiermuster (pattern) lassen sich häufig als Funktionen höherer Ordnung darstellen. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Beispiele wiederkehrender Programmiermuster bei Listen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Beispiele wiederkehrender Programmiermuster bei Listen Test, ob alle Elemente einer Liste eine Bedingung erfüllen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Beispiele wiederkehrender Programmiermuster bei Listen Test, ob alle Elemente einer Liste eine Bedingung erfüllen Test, ob mindestens ein Element einer Liste eine Bedingung erfüllt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Beispiele wiederkehrender Programmiermuster bei Listen Test, ob alle Elemente einer Liste eine Bedingung erfüllen Test, ob mindestens ein Element einer Liste eine Bedingung erfüllt Auswählen der Elemente einer Liste, die einer Bedingung genügen (und verwerfen der anderen; sog. Filtern) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Beispiele wiederkehrender Programmiermuster bei Listen Test, ob alle Elemente einer Liste eine Bedingung erfüllen Test, ob mindestens ein Element einer Liste eine Bedingung erfüllt Auswählen der Elemente einer Liste, die einer Bedingung genügen (und verwerfen der anderen; sog. Filtern) Anwenden einer Funktion auf jedes Element einer Liste und Rückgabe der Liste mit den Resultaten D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen höherer Ordnung: Beispiele wiederkehrender Programmiermuster bei Listen Test, ob alle Elemente einer Liste eine Bedingung erfüllen Test, ob mindestens ein Element einer Liste eine Bedingung erfüllt Auswählen der Elemente einer Liste, die einer Bedingung genügen (und verwerfen der anderen; sog. Filtern) Anwenden einer Funktion auf jedes Element einer Liste und Rückgabe der Liste mit den Resultaten u.v.a.m. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Gilt Bedingung für alle?’: Programmiermuster: Test, ob alle Elemente einer Liste eine Bedingung erfüllen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Gilt Bedingung für alle?’: Programmiermuster: Test, ob alle Elemente einer Liste eine Bedingung erfüllen Fallunterscheidung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Gilt Bedingung für alle?’: Programmiermuster: Test, ob alle Elemente einer Liste eine Bedingung erfüllen Fallunterscheidung: Liste ist leer, dann trifft Bedingung zu D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Gilt Bedingung für alle?’: Programmiermuster: Test, ob alle Elemente einer Liste eine Bedingung erfüllen Fallunterscheidung: Liste ist leer, dann trifft Bedingung zu bei nichtleerer Liste muss der Kopf die Bedingung erfüllen und die Bedingung muss – rekursiv – für alle Elemente des Rests der Liste zutreffen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Gilt Bedingung für alle?’: Realisierung als Funktion all mit D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Gilt Bedingung für alle?’: Realisierung als Funktion all mit erstes Argument: Bedingung als Prädikat pred, d.h. als Funktion vom Typ a -> Bool für bel. Typ a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Gilt Bedingung für alle?’: Realisierung als Funktion all mit erstes Argument: Bedingung als Prädikat pred, d.h. als Funktion vom Typ a -> Bool für bel. Typ a zweites Argument: zu testende Liste mit Elementen vom Typ a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Gilt Bedingung für alle?’: Realisierung als Funktion all mit erstes Argument: Bedingung als Prädikat pred, d.h. als Funktion vom Typ a -> Bool für bel. Typ a zweites Argument: zu testende Liste mit Elementen vom Typ a in Haskell (s.a. Prelude.hs): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Gilt Bedingung für alle?’: Realisierung als Funktion all mit erstes Argument: Bedingung als Prädikat pred, d.h. als Funktion vom Typ a -> Bool für bel. Typ a zweites Argument: zu testende Liste mit Elementen vom Typ a in Haskell (s.a. Prelude.hs): Beispiel all :: (a -> Bool) -> [a] -> Bool all pred [] = True all pred (x:xs) = pred x && all pred xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Bedingung für mind. ein Element erfüllt?’: Programmiermuster: Test, ob mind. ein Element einer Liste eine Bedingung erfüllt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Bedingung für mind. ein Element erfüllt?’: Programmiermuster: Test, ob mind. ein Element einer Liste eine Bedingung erfüllt Fallunterscheidung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Bedingung für mind. ein Element erfüllt?’: Programmiermuster: Test, ob mind. ein Element einer Liste eine Bedingung erfüllt Fallunterscheidung: Liste ist leer, dann gibt es kein Element, welches Bedingung erfüllt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Bedingung für mind. ein Element erfüllt?’: Programmiermuster: Test, ob mind. ein Element einer Liste eine Bedingung erfüllt Fallunterscheidung: Liste ist leer, dann gibt es kein Element, welches Bedingung erfüllt bei nichtleerer Liste muss entweder Kopf die Bedingung erfüllen oder die Bedingung muss – rekursiv – für mind. ein Element des Rests der Liste zutreffen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Bedingung für mind. ein Element erfüllt?’: Realisierung als Funktion any mit D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Bedingung für mind. ein Element erfüllt?’: Realisierung als Funktion any mit erstes Argument: Bedingung als Prädikat pred, d.h. als Funktion vom Typ a -> Bool für bel. Typ a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Bedingung für mind. ein Element erfüllt?’: Realisierung als Funktion any mit erstes Argument: Bedingung als Prädikat pred, d.h. als Funktion vom Typ a -> Bool für bel. Typ a zweites Argument: zu testende Liste mit Elementen vom Typ a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Bedingung für mind. ein Element erfüllt?’: Realisierung als Funktion any mit erstes Argument: Bedingung als Prädikat pred, d.h. als Funktion vom Typ a -> Bool für bel. Typ a zweites Argument: zu testende Liste mit Elementen vom Typ a in Haskell (s.a. Prelude.hs): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster ’Bedingung für mind. ein Element erfüllt?’: Realisierung als Funktion any mit erstes Argument: Bedingung als Prädikat pred, d.h. als Funktion vom Typ a -> Bool für bel. Typ a zweites Argument: zu testende Liste mit Elementen vom Typ a in Haskell (s.a. Prelude.hs): Beispiel any :: (a -> Bool) -> [a] -> Bool any pred [] = False any pred (x:xs) = pred x || any pred xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster Filtern: Wiederkehrende Frage und Aufgabe: welche Elemente einer Liste genügen einer gewünschten Eigenschaft? Wähle diese aus und verwerfe die anderen. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster Filtern: Wiederkehrende Frage und Aufgabe: welche Elemente einer Liste genügen einer gewünschten Eigenschaft? Wähle diese aus und verwerfe die anderen. wiederum: Darstellung von Eigenschaften als Prädikate, d.h. als Funktionen vom Typ t -> Bool für bel. Typ t D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster Filtern: Wiederkehrende Frage und Aufgabe: welche Elemente einer Liste genügen einer gewünschten Eigenschaft? Wähle diese aus und verwerfe die anderen. wiederum: Darstellung von Eigenschaften als Prädikate, d.h. als Funktionen vom Typ t -> Bool für bel. Typ t Funktion filter nimmt ein Prädikat und eine Liste als Argument und gibt die Liste derjenigen Elemente zurück, für die das Prädikat zutrifft D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster Filtern: Wiederkehrende Frage und Aufgabe: welche Elemente einer Liste genügen einer gewünschten Eigenschaft? Wähle diese aus und verwerfe die anderen. wiederum: Darstellung von Eigenschaften als Prädikate, d.h. als Funktionen vom Typ t -> Bool für bel. Typ t Funktion filter nimmt ein Prädikat und eine Liste als Argument und gibt die Liste derjenigen Elemente zurück, für die das Prädikat zutrifft mögliche Definition direkt: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster Filtern: Wiederkehrende Frage und Aufgabe: welche Elemente einer Liste genügen einer gewünschten Eigenschaft? Wähle diese aus und verwerfe die anderen. wiederum: Darstellung von Eigenschaften als Prädikate, d.h. als Funktionen vom Typ t -> Bool für bel. Typ t Funktion filter nimmt ein Prädikat und eine Liste als Argument und gibt die Liste derjenigen Elemente zurück, für die das Prädikat zutrifft mögliche Definition direkt: Beispiel filter p [] = [] filter p (x:xs) = if p x then x:(filter p xs) else filter p xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster Filtern: mögliche Definition als Listenkomprehension: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster Filtern: mögliche Definition als Listenkomprehension: Beispiel filter p xs = [x | x <- xs, p x] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster Filtern: mögliche Definition als Listenkomprehension: Beispiel filter p xs = [x | x <- xs, p x] Typ von filter?: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Programmiermuster Filtern: mögliche Definition als Listenkomprehension: Beispiel filter p xs = [x | x <- xs, p x] Typ von filter?: filter :: ( a -> Bool) -> [a] -> [a] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map Programmiermuster: Anwendung einer Funktion auf jedes Element einer Liste; Ergebnis ist die Liste der Funktionswerte zu den Elementen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map Programmiermuster: Anwendung einer Funktion auf jedes Element einer Liste; Ergebnis ist die Liste der Funktionswerte zu den Elementen mögliche Definitionen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map Programmiermuster: Anwendung einer Funktion auf jedes Element einer Liste; Ergebnis ist die Liste der Funktionswerte zu den Elementen mögliche Definitionen: direkt: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map Programmiermuster: Anwendung einer Funktion auf jedes Element einer Liste; Ergebnis ist die Liste der Funktionswerte zu den Elementen mögliche Definitionen: direkt: Beispiel map f [] = [] map f (x:xs) = f x : (map f xs) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map Programmiermuster: Anwendung einer Funktion auf jedes Element einer Liste; Ergebnis ist die Liste der Funktionswerte zu den Elementen mögliche Definitionen: direkt: Beispiel map f [] = [] map f (x:xs) = f x : (map f xs) als Listenkomprehension: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map Programmiermuster: Anwendung einer Funktion auf jedes Element einer Liste; Ergebnis ist die Liste der Funktionswerte zu den Elementen mögliche Definitionen: direkt: Beispiel map f [] = [] map f (x:xs) = f x : (map f xs) als Listenkomprehension: Beispiel map f xs = [ f x | x <- xs] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map cont. Typ von map? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map cont. Typ von map? map :: (a -> b) -> [a] -> [b] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map cont. Typ von map? map :: (a -> b) -> [a] -> [b] Beispiele für Anwendung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map cont. Typ von map? map :: (a -> b) -> [a] -> [b] Beispiele für Anwendung: Beispiel doubleAll xs = map double xs double x = 2 * x D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Die Funktion map cont. Typ von map? map :: (a -> b) -> [a] -> [b] Beispiele für Anwendung: Beispiel doubleAll xs = map double xs double x = 2 * x Beispiel convertChrs :: [Char] -> [Int] convertChrs xs = map ord xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Elementweises Verbinden von Listen: zip zip: aus zwei Listen (d.h. Paar von Listen) mache Liste mit Paaren korrespondierender Elemente; ignoriere „überschüssige“ Elemente ohne korrespondierenden Partner D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Elementweises Verbinden von Listen: zip zip: aus zwei Listen (d.h. Paar von Listen) mache Liste mit Paaren korrespondierender Elemente; ignoriere „überschüssige“ Elemente ohne korrespondierenden Partner Definition (direkt; s.a. Prelude.hs) zip :: [a] -> [b] -> [(a,b)] zip [] _ = [] zip _ [] = [] zip (x:xs) (y:ys) = (x,y):(zip xs ys) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Elementweises Verbinden von Listen: zip zip: aus zwei Listen (d.h. Paar von Listen) mache Liste mit Paaren korrespondierender Elemente; ignoriere „überschüssige“ Elemente ohne korrespondierenden Partner Definition (direkt; s.a. Prelude.hs) zip :: [a] -> [b] -> [(a,b)] zip [] _ = [] zip _ [] = [] zip (x:xs) (y:ys) = (x,y):(zip xs ys) Beispiel: zip [4,7,1,1] "Koeln" = [(4,’K’),(7,’o’),(1,’e’),(1,’l’)] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Elementweises Verbinden von Listen: zipWith Verallgemeinerung zipWith: verknüpfe die korrespondierenden Elemente mit einer zweistelligen Funktion D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Elementweises Verbinden von Listen: zipWith Verallgemeinerung zipWith: verknüpfe die korrespondierenden Elemente mit einer zweistelligen Funktion zipWith f (x:xs) (y:ys) = f x y : (zipWith f xs ys) zipWith f _ _ = [] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Elementweises Verbinden von Listen: zipWith Verallgemeinerung zipWith: verknüpfe die korrespondierenden Elemente mit einer zweistelligen Funktion zipWith f (x:xs) (y:ys) = f x y : (zipWith f xs ys) zipWith f _ _ = [] Beispiel: zip [1 .. 4] [2,4,6,8] ==> ... ? zipWith (+) [1 .. 4] [2,4,6,8] ==> ... ? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Elementweises Verbinden von Listen: zipWith Verallgemeinerung zipWith: verknüpfe die korrespondierenden Elemente mit einer zweistelligen Funktion zipWith f (x:xs) (y:ys) = f x y : (zipWith f xs ys) zipWith f _ _ = [] Beispiel: zip [1 .. 4] [2,4,6,8] ==> ... ? zipWith (+) [1 .. 4] [2,4,6,8] ==> ... ? Typ von zipWith? : zipWith :: ................................... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Anonyme Funktionen Funktionen als Argumente von Funktionen höherer Ordnung können einerseits durch ihren Namen referenziert werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Anonyme Funktionen Funktionen als Argumente von Funktionen höherer Ordnung können einerseits durch ihren Namen referenziert werden wird eine Funktion nur als Argument bei einer Anwendung einer Funktion höherer Ordnung benötigt (und nirgends sonst), so reicht oft auch eine sog. anonyme Funktion aus D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Anonyme Funktionen Funktionen als Argumente von Funktionen höherer Ordnung können einerseits durch ihren Namen referenziert werden wird eine Funktion nur als Argument bei einer Anwendung einer Funktion höherer Ordnung benötigt (und nirgends sonst), so reicht oft auch eine sog. anonyme Funktion aus die Darstellung anonymer Funktionen erfolgt durch einen Lambda-Ausdruck mit der Syntax: (\<var(s)> -> <körper>) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Anonyme Funktionen Funktionen als Argumente von Funktionen höherer Ordnung können einerseits durch ihren Namen referenziert werden wird eine Funktion nur als Argument bei einer Anwendung einer Funktion höherer Ordnung benötigt (und nirgends sonst), so reicht oft auch eine sog. anonyme Funktion aus die Darstellung anonymer Funktionen erfolgt durch einen Lambda-Ausdruck mit der Syntax: (\<var(s)> -> <körper>) Syntax in Anlehnung an den sog. λ-Kalkül mit (λxy .x ∗ x + y ) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Anonyme Funktionen Beispiele anonymer Funktionen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Anonyme Funktionen Beispiele anonymer Funktionen: Beispiel (\x -> x*x) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Anonyme Funktionen Beispiele anonymer Funktionen: Beispiel (\x -> x*x) Beispiel (\x y -> x*x - 2*x*y + y*y) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Anonyme Funktionen Beispiele anonymer Funktionen: Beispiel (\x -> x*x) Beispiel (\x y -> x*x - 2*x*y + y*y) Beispiel (Variante) (\x -> (\y -> x*x - 2*x*y + y*y)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Anonyme Funktionen Beispiele anonymer Funktionen: Beispiel (\x -> x*x) Beispiel (\x y -> x*x - 2*x*y + y*y) Beispiel (Variante) (\x -> (\y -> x*x - 2*x*y + y*y)) Beachte: anonyme Funktionen sind wie benannte Funktionen verwendbar D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionale Abstraktion: Beispiele rekursiv definierter Funktionen (vgl. [RL99], 1.2.2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionale Abstraktion: Beispiele rekursiv definierter Funktionen (vgl. [RL99], 1.2.2) Fakultätsfunktion fact n | n == 0 | n > 0 D. Rösner = 1 = n * fact(n-1) AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionale Abstraktion: Beispiele rekursiv definierter Funktionen (vgl. [RL99], 1.2.2) Fakultätsfunktion fact n | n == 0 = 1 | n > 0 = n * fact(n-1) Summe der natürlichen Zahlen bis n sumInt n | n == 0 = 0 | n > 0 = n + sumInt(n-1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionale Abstraktion: Beispiele rekursiv definierter Funktionen (vgl. [RL99], 1.2.2) Fakultätsfunktion fact n | n == 0 = 1 | n > 0 = n * fact(n-1) Summe der natürlichen Zahlen bis n sumInt n | n == 0 = 0 | n > 0 = n + sumInt(n-1) Summe der Quadrate der natürlichen Zahlen bis n sumSqr n | n == 0 = 0 | n > 0 = n*n + sumSqr(n-1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiele . . . cont. das den obigen Beispielen zugrundeliegende Rekursionsprinzip kann wie folgt abstrahiert werden: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiele . . . cont. das den obigen Beispielen zugrundeliegende Rekursionsprinzip kann wie folgt abstrahiert werden: es wird Funktionswert für die Basis (d.h. für n == 0) definiert D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiele . . . cont. das den obigen Beispielen zugrundeliegende Rekursionsprinzip kann wie folgt abstrahiert werden: es wird Funktionswert für die Basis (d.h. für n == 0) definiert der Funktionswert für n ergibt sich durch Kombination von n (bzw. eines aus n berechneten Werts) mit dem Funktionswert für (n-1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiele . . . cont. das den obigen Beispielen zugrundeliegende Rekursionsprinzip kann wie folgt abstrahiert werden: es wird Funktionswert für die Basis (d.h. für n == 0) definiert der Funktionswert für n ergibt sich durch Kombination von n (bzw. eines aus n berechneten Werts) mit dem Funktionswert für (n-1) m.a.W.: der Rekursionsschritt wird als Anwendung einer zweistelligen Kombinationsfunktion auf n und Funktionswert für (n-1) realisiert D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiele . . . cont. das den obigen Beispielen zugrundeliegende Rekursionsprinzip kann wie folgt abstrahiert werden: es wird Funktionswert für die Basis (d.h. für n == 0) definiert der Funktionswert für n ergibt sich durch Kombination von n (bzw. eines aus n berechneten Werts) mit dem Funktionswert für (n-1) m.a.W.: der Rekursionsschritt wird als Anwendung einer zweistelligen Kombinationsfunktion auf n und Funktionswert für (n-1) realisiert s.a. [RL99], 1.2.2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung dieser Abstraktion in Haskell mögliche Definition als Funktion höherer Ordnung D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung dieser Abstraktion in Haskell mögliche Definition als Funktion höherer Ordnung Definition induction base comb n | n == 0 = base | n > 0 = comb n (induction base comb (n-1)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung dieser Abstraktion in Haskell mögliche Definition als Funktion höherer Ordnung Definition induction base comb n | n == 0 = base | n > 0 = comb n (induction base comb (n-1)) Problem Was ist der Typ von induction ? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung dieser Abstraktion in Haskell mögliche Definition als Funktion höherer Ordnung Definition induction base comb n | n == 0 = base | n > 0 = comb n (induction base comb (n-1)) Problem Was ist der Typ von induction ? Lösung induction :: . . . D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Darstellung dieser Abstraktion in Haskell mögliche Definition als Funktion höherer Ordnung Definition induction base comb n | n == 0 = base | n > 0 = comb n (induction base comb (n-1)) Problem Was ist der Typ von induction ? Lösung induction :: . . . s.a. [RL99], 1.2.2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Abstraktion: induction induction ist Funktion höherer Ordnung (nimmt eine Funktion als Argument; hier: comb) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Abstraktion: induction induction ist Funktion höherer Ordnung (nimmt eine Funktion als Argument; hier: comb) damit Darstellung von fact bzw. sumInt mit Hilfe von induction und der vordefinierten Funktionen (+) bzw. (*) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Abstraktion: induction induction ist Funktion höherer Ordnung (nimmt eine Funktion als Argument; hier: comb) damit Darstellung von fact bzw. sumInt mit Hilfe von induction und der vordefinierten Funktionen (+) bzw. (*) > fact n = induction 1 (*) n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Abstraktion: induction induction ist Funktion höherer Ordnung (nimmt eine Funktion als Argument; hier: comb) damit Darstellung von fact bzw. sumInt mit Hilfe von induction und der vordefinierten Funktionen (+) bzw. (*) > fact n = induction 1 (*) n > sumInt n = induction 0 (+) n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Abstraktion: induction alternativ: Definition auf Funktionsebene möglich, d.h. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Abstraktion: induction alternativ: Definition auf Funktionsebene möglich, d.h. > fact = induction 1 (*) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Abstraktion: induction alternativ: Definition auf Funktionsebene möglich, d.h. > fact = induction 1 (*) > sumInt = induction 0 (+) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Abstraktion: induction alternativ: Definition auf Funktionsebene möglich, d.h. > fact = induction 1 (*) > sumInt = induction 0 (+) die rechten Seiten dieser Gleichungen zeigen sog. partielle Anwendungen von mehrstelligen Funktionen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Benannte vs. anonyme Funktionen die Kombinationsfunktion für sumSqr könnte benannt definiert werden, z.B. f x y = x*x + y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Benannte vs. anonyme Funktionen die Kombinationsfunktion für sumSqr könnte benannt definiert werden, z.B. f x y = x*x + y dann: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Benannte vs. anonyme Funktionen die Kombinationsfunktion für sumSqr könnte benannt definiert werden, z.B. f x y = x*x + y dann: > sumSqr n = induction 0 f n bzw. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Benannte vs. anonyme Funktionen die Kombinationsfunktion für sumSqr könnte benannt definiert werden, z.B. f x y = x*x + y dann: > sumSqr n = induction 0 f n bzw. > sumSqr = induction 0 f D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Benannte vs. anonyme Funktionen alternativ: Kombinationsfunktion als sog. anonyme Funktion D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Benannte vs. anonyme Funktionen alternativ: Kombinationsfunktion als sog. anonyme Funktion sumSqr n = induction 0 (\x y -> x*x + y) n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Benannte vs. anonyme Funktionen alternativ: Kombinationsfunktion als sog. anonyme Funktion sumSqr n = induction 0 (\x y -> x*x + y) n bzw. sumSqr = induction 0 (\x y -> x*x + y) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen als Werte: Beispiel: Funktionen zur Manipulation beliebiger reeller Funktionen (vgl. [PH06], 1.2, p. 24) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen als Werte: Beispiel: Funktionen zur Manipulation beliebiger reeller Funktionen (vgl. [PH06], 1.2, p. 24) Sei f :: Float -> Float beliebig. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen als Werte: Beispiel: Funktionen zur Manipulation beliebiger reeller Funktionen (vgl. [PH06], 1.2, p. 24) Sei f :: Float -> Float beliebig. Dann: shift :: Float -> (Float -> Float) -> (Float -> Float) shift dx f x = f (x - dx) mirror :: (Float -> Float) -> (Float -> Float) mirror f x = f (-x) stretch :: Float -> (Float -> Float) -> (Float -> Float) stretch r f x = f (x/r) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen als Werte: Beispiel: Funktionen zur Manipulation beliebiger reeller Funktionen (vgl. [PH06], 1.2, p. 24) Sei f :: Float -> Float beliebig. Dann: shift :: Float -> (Float -> Float) -> (Float -> Float) shift dx f x = f (x - dx) mirror :: (Float -> Float) -> (Float -> Float) mirror f x = f (-x) stretch :: Float -> (Float -> Float) -> (Float -> Float) stretch r f x = f (x/r) Frage: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen als Werte: Beispiel: Funktionen zur Manipulation beliebiger reeller Funktionen (vgl. [PH06], 1.2, p. 24) Sei f :: Float -> Float beliebig. Dann: shift :: Float -> (Float -> Float) -> (Float -> Float) shift dx f x = f (x - dx) mirror :: (Float -> Float) -> (Float -> Float) mirror f x = f (-x) stretch :: Float -> (Float -> Float) -> (Float -> Float) stretch r f x = f (x/r) Frage: Wie wirken sich shift, mirror und stretch aus? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Verknüpfung von Funktionen als Kontrollstruktur: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Verknüpfung von Funktionen als Kontrollstruktur: Ausgabe einer Funktion wird Eingabe der nachfolgenden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Verknüpfung von Funktionen als Kontrollstruktur: Ausgabe einer Funktion wird Eingabe der nachfolgenden Definition: (f . g) x = f ( g x ) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Verknüpfung von Funktionen als Kontrollstruktur: Ausgabe einer Funktion wird Eingabe der nachfolgenden Definition: (f . g) x = f ( g x ) f . g bedeutet: wende zuerst g, dann f an D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Verknüpfung von Funktionen als Kontrollstruktur: Ausgabe einer Funktion wird Eingabe der nachfolgenden Definition: (f . g) x = f ( g x ) f . g bedeutet: wende zuerst g, dann f an m.a.W. Verknüpfung muss von rechts nach links gelesen werden als ‘g, dann f’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Typ von ‘.‘: (.) :: (b -> c) -> (a -> b) -> (a -> c) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Typ von ‘.‘: (.) :: (b -> c) -> (a -> b) -> (a -> c) Funktionskomposition ist assoziativ, d.h. für alle f, g und h f . (g . h) = (f . g) . h D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Typ von ‘.‘: (.) :: (b -> c) -> (a -> b) -> (a -> c) Funktionskomposition ist assoziativ, d.h. für alle f, g und h f . (g . h) = (f . g) . h in Haskell aus technischen Gründen als rechtsassoziativ behandelt; d.h. f . g . h = f . (g . h) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel Funktionskomposition: eine Funktion zweimal anwenden eine Funktion zweimal anwenden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel Funktionskomposition: eine Funktion zweimal anwenden eine Funktion zweimal anwenden Beispiel twice :: (a -> a) -> (a -> a) twice f = f . f D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel Funktionskomposition: eine Funktion zweimal anwenden eine Funktion zweimal anwenden Beispiel twice :: (a -> a) -> (a -> a) twice f = f . f Sei succ :: Int -> Int succ n = n + 1 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel Funktionskomposition: eine Funktion zweimal anwenden eine Funktion zweimal anwenden Beispiel twice :: (a -> a) -> (a -> a) twice f = f . f Sei succ :: Int -> Int succ n = n + 1 Was ergibt dann (twice succ) 7 ==> ... ? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Verallgemeinerung: n-fach wiederholte Funktionsanwendung D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Verallgemeinerung: n-fach wiederholte Funktionsanwendung Beispiel iter :: Int -> (a -> a) -> (a -> a) iter n f | n > 0 |otherwise = f . iter (n-1) f = id D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionskomposition Verallgemeinerung: n-fach wiederholte Funktionsanwendung Beispiel iter :: Int -> (a -> a) -> (a -> a) iter n f | n > 0 |otherwise = f . iter (n-1) f = id Frage: Was ergibt iter n double 1 ==> ... ? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Partielle Anwendung Beispiel: multiply :: Int -> Int -> Int multiply x y = x * y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Partielle Anwendung Beispiel: multiply :: Int -> Int -> Int multiply x y = x * y Frage: was ergibt multiply 2 ==> ... ? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Partielle Anwendung cont. Beispiel doubleAll :: [Int] -> [Int] doubleAll = map (multiply 2) hier zwei partielle Anwendungen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Partielle Anwendung cont. Beispiel doubleAll :: [Int] -> [Int] doubleAll = map (multiply 2) hier zwei partielle Anwendungen: multiply 2 :: Int -> Int D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Partielle Anwendung cont. Beispiel doubleAll :: [Int] -> [Int] doubleAll = map (multiply 2) hier zwei partielle Anwendungen: multiply 2 :: Int -> Int map (multiply 2) :: [Int] -> [Int] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Partielle Anwendung cont. Beispiel doubleAll :: [Int] -> [Int] doubleAll = map (multiply 2) hier zwei partielle Anwendungen: multiply 2 :: Int -> Int map (multiply 2) :: [Int] -> [Int] Variante ohne partielle Anwendung von map: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Partielle Anwendung cont. Beispiel doubleAll :: [Int] -> [Int] doubleAll = map (multiply 2) hier zwei partielle Anwendungen: multiply 2 :: Int -> Int map (multiply 2) :: [Int] -> [Int] Variante ohne partielle Anwendung von map: Beispiel doubleAll xs = map (multiply 2) xs D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Bestimmung des Typs einer partiellen Anwendung Streichungsregel (cancellation rule) (s.a. [Tho99], 10.4): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Bestimmung des Typs einer partiellen Anwendung Streichungsregel (cancellation rule) (s.a. [Tho99], 10.4): Wenn der Typ einer Funktion f t1 -> t2 -> ...tn -> t ist D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Bestimmung des Typs einer partiellen Anwendung Streichungsregel (cancellation rule) (s.a. [Tho99], 10.4): Wenn der Typ einer Funktion f t1 -> t2 -> ...tn -> t ist und diese wird angewendet auf e1 ::t1 , e2 ::t2 , ..., ek ::tk mit (k<=n), D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Bestimmung des Typs einer partiellen Anwendung Streichungsregel (cancellation rule) (s.a. [Tho99], 10.4): Wenn der Typ einer Funktion f t1 -> t2 -> ...tn -> t ist und diese wird angewendet auf e1 ::t1 , e2 ::t2 , ..., ek ::tk mit (k<=n), dann ergibt sich der Ergebnistyp durch „Streichen“ der Typen t1 bis tk , D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Bestimmung des Typs einer partiellen Anwendung Streichungsregel (cancellation rule) (s.a. [Tho99], 10.4): Wenn der Typ einer Funktion f t1 -> t2 -> ...tn -> t ist und diese wird angewendet auf e1 ::t1 , e2 ::t2 , ..., ek ::tk mit (k<=n), dann ergibt sich der Ergebnistyp durch „Streichen“ der Typen t1 bis tk , d.h. der Ergebnistyp von f e1 e2 ...ek ist tk +1 -> tk +2 -> ...tn -> t D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Assoziativität Beachte: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Assoziativität Beachte: Funktionsanwendung ist linksassoziativ, d.h. f x y = (f x) y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Assoziativität Beachte: Funktionsanwendung ist linksassoziativ, d.h. f x y = (f x) y -> ist rechtsassoziativ, d.h. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Assoziativität Beachte: Funktionsanwendung ist linksassoziativ, d.h. f x y = (f x) y -> ist rechtsassoziativ, d.h. a -> b -> c D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Assoziativität Beachte: Funktionsanwendung ist linksassoziativ, d.h. f x y = (f x) y -> ist rechtsassoziativ, d.h. a -> b -> c entspricht D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Assoziativität Beachte: Funktionsanwendung ist linksassoziativ, d.h. f x y = (f x) y -> ist rechtsassoziativ, d.h. a -> b -> c entspricht a -> (b -> c) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Assoziativität Beachte: Funktionsanwendung ist linksassoziativ, d.h. f x y = (f x) y -> ist rechtsassoziativ, d.h. a -> b -> c entspricht a -> (b -> c) -> ist nicht assoziativ; D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Assoziativität Beachte: Funktionsanwendung ist linksassoziativ, d.h. f x y = (f x) y -> ist rechtsassoziativ, d.h. a -> b -> c entspricht a -> (b -> c) -> ist nicht assoziativ; Beispiel: g :: (Int -> Int) -> Int g h = (h 0) + (h 1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell Beachte: jede Funktion in Haskell nimmt exakt ein Argument D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell Beachte: jede Funktion in Haskell nimmt exakt ein Argument So bedeutet multiply :: Int -> Int -> Int wegen der Rechtsassoziativität multiply :: Int -> (Int -> Int) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell Beachte: jede Funktion in Haskell nimmt exakt ein Argument So bedeutet multiply :: Int -> Int -> Int wegen der Rechtsassoziativität multiply :: Int -> (Int -> Int) Damit multiply 2 :: Int -> Int und (multiply 2) 5 :: Int D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell Allgemein (s.a. [Tho99], 10.4): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell Allgemein (s.a. [Tho99], 10.4): f e1 e2 ...ek bzw. t1 -> t2 -> ...tn -> t D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen in Haskell Allgemein (s.a. [Tho99], 10.4): f e1 e2 ...ek bzw. t1 -> t2 -> ...tn -> t sind Abkürzungen für (...((f e1 ) e2 ) ...ek ) bzw. t1 -> (t2 -> (...(tn -> t) ...)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: Beispiel: Berechnung Fakultät D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: Beispiel: Berechnung Fakultät Definition: n! = n * (n - 1) * . . . * 2 *1 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: Beispiel: Berechnung Fakultät Definition: n! = n * (n - 1) * . . . * 2 *1 rekursiver Zusammenhang: n! = n * (n - 1)! D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: Beispiel: Berechnung Fakultät Definition: n! = n * (n - 1) * . . . * 2 *1 rekursiver Zusammenhang: n! = n * (n - 1)! direkt umsetzbar: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: Beispiel: Berechnung Fakultät Definition: n! = n * (n - 1) * . . . * 2 *1 rekursiver Zusammenhang: n! = n * (n - 1)! direkt umsetzbar: Beispiel fak :: Int -> Int fak n = if n == 0 then 1 else n * fak (n - 1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 6 * fak 5 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 6 * fak 5 6 * (5 * fak 4) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) (5 * (4 * (3 * (2 * fak 1)))) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) (5 * (4 * (3 * (2 * fak 1)))) (5 * (4 * (3 * (2 * (1 * fak 0))))) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) (5 * (4 * (3 * (2 * fak 1)))) (5 * (4 * (3 * (2 * (1 * fak 0))))) (5 * (4 * (3 * (2 * (1 * 1))))) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) (5 * (4 * (3 * (2 * fak 1)))) (5 * (4 * (3 * (2 * (1 * fak 0))))) (5 * (4 * (3 * (2 * (1 * 1))))) (5 * (4 * (3 * (2 * 1)))) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) (5 * (4 * (3 * (2 * fak 1)))) (5 * (4 * (3 * (2 * (1 * fak 0))))) (5 * (4 * (3 * (2 * (1 * 1))))) (5 * (4 * (3 * (2 * 1)))) (5 * (4 * (3 * 2))) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) (5 * (4 * (3 * (2 * fak 1)))) (5 * (4 * (3 * (2 * (1 * fak 0))))) (5 * (4 * (3 * (2 * (1 * 1))))) (5 * (4 * (3 * (2 * 1)))) (5 * (4 * (3 * 2))) (5 * (4 * 6)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) (5 * (4 * (3 * (2 * fak 1)))) (5 * (4 * (3 * (2 * (1 * fak 0))))) (5 * (4 * (3 * (2 * (1 * 1))))) (5 * (4 * (3 * (2 * 1)))) (5 * (4 * (3 * 2))) (5 * (4 * 6)) (5 * 24) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) (5 * (4 * (3 * (2 * fak 1)))) (5 * (4 * (3 * (2 * (1 * fak 0))))) (5 * (4 * (3 * (2 * (1 * 1))))) (5 * (4 * (3 * (2 * 1)))) (5 * (4 * (3 * 2))) (5 * (4 * 6)) (5 * 24) 120 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: zugehörige Berechnung der Fakultät ist ein sog. linear-rekursiver Prozess (s.a. [AGJ96]) schematischer Ablauf einer Berechnung (vereinfacht): fak 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 6 * 720 6 fak 5 (5 * fak 4) (5 * (4 * fak 3)) (5 * (4 * (3 * fak 2))) (5 * (4 * (3 * (2 * fak 1)))) (5 * (4 * (3 * (2 * (1 * fak 0))))) (5 * (4 * (3 * (2 * (1 * 1))))) (5 * (4 * (3 * (2 * 1)))) (5 * (4 * (3 * 2))) (5 * (4 * 6)) (5 * 24) 120 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: Nachteile dieser direkten rekursiven Implementierung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: Nachteile dieser direkten rekursiven Implementierung: Berechnungen (hier: die Multiplikationen) bleiben offen, bis mit fak 0 das Ende des rekursiven Abstiegs erreicht wird D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Funktionen und Prozesse: Nachteile dieser direkten rekursiven Implementierung: Berechnungen (hier: die Multiplikationen) bleiben offen, bis mit fak 0 das Ende des rekursiven Abstiegs erreicht wird für jeden rekursiven Aufruf von fak wird zusätzlicher Platz benötigt für den jeweiligen sog. Kontext mit dem Funktionsparameter (im allgemeinen Fall: den Funktionsparametern) und seinem aktuellen Wert (bzw. ihren aktuellen Werten) sowie dem Funktionskörper D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung Fakultät als linear-iterativer Prozess alternatives Vorgehen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung Fakultät als linear-iterativer Prozess alternatives Vorgehen: in jedem Schritt wird der komplette Systemzustand (hier bestehend aus dem bisher gebildeten Teilprodukt und einem Zähler) an den nächsten Funktionsaufruf übergeben D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung Fakultät als linear-iterativer Prozess alternatives Vorgehen: in jedem Schritt wird der komplette Systemzustand (hier bestehend aus dem bisher gebildeten Teilprodukt und einem Zähler) an den nächsten Funktionsaufruf übergeben m.a.W.: Übergabe folgender Werte (s.a. [AGJ96]) product <-- counter * product counter <-- counter + 1 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung Fakultät als linear-iterativer Prozess alternatives Vorgehen: in jedem Schritt wird der komplette Systemzustand (hier bestehend aus dem bisher gebildeten Teilprodukt und einem Zähler) an den nächsten Funktionsaufruf übergeben m.a.W.: Übergabe folgender Werte (s.a. [AGJ96]) product <-- counter * product counter <-- counter + 1 umgesetzt nach Haskell: fak’ n = facIter 1 1 n facIter product counter maxCount = if (counter > maxCount) then product else facIter (counter*product)(counter+1) maxCount D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung Fakultät als linear-iterativer Prozess schematischer Ablauf einer Berechnung (vereinfacht, s.a. [AGJ96]): fak’ 6 facIter 1 1 facIter 1 2 facIter 2 3 facIter 6 4 facIter 24 5 facIter 120 6 facIter 720 7 720 6 6 6 6 6 6 6 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung Fakultät als linear-iterativer Prozess schematischer Ablauf einer Berechnung (vereinfacht, s.a. [AGJ96]): fak’ 6 facIter 1 1 facIter 1 2 facIter 2 3 facIter 6 4 facIter 24 5 facIter 120 6 facIter 720 7 720 6 6 6 6 6 6 6 hier bleiben keine Berechnungen ’offen’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung Fakultät als linear-iterativer Prozess schematischer Ablauf einer Berechnung (vereinfacht, s.a. [AGJ96]): fak’ 6 facIter 1 1 facIter 1 2 facIter 2 3 facIter 6 4 facIter 24 5 facIter 120 6 facIter 720 7 720 6 6 6 6 6 6 6 hier bleiben keine Berechnungen ’offen’ mit Erreichen der Abbbruchbedingung steht das Ergebnis fest D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Beispiel: Berechnung Fakultät als linear-iterativer Prozess schematischer Ablauf einer Berechnung (vereinfacht, s.a. [AGJ96]): fak’ 6 facIter 1 1 facIter 1 2 facIter 2 3 facIter 6 4 facIter 24 5 facIter 120 6 facIter 720 7 720 6 6 6 6 6 6 6 hier bleiben keine Berechnungen ’offen’ mit Erreichen der Abbbruchbedingung steht das Ergebnis fest das Argument für die Teilprodukte wird auch Akkumulator genannt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Definition (endrekursive Aufrufe) Rekursive Aufrufe, die nicht in einem Kontext mit offenen Berechnungen stehen, sondern welche die kompletten Informationen zur Fortführung der Berechnungen enthalten, heissen endrekursiv (engl. tail recursive) (s.a. [KS07], 6.7). D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Definition (endrekursive Aufrufe) Rekursive Aufrufe, die nicht in einem Kontext mit offenen Berechnungen stehen, sondern welche die kompletten Informationen zur Fortführung der Berechnungen enthalten, heissen endrekursiv (engl. tail recursive) (s.a. [KS07], 6.7). Definition (endrekursive Funktionen (s.a. [KS07], 6.7)) Funktionen, in deren Definition nur endrekursive Aufrufe enthalten sind, heissen ebenfalls endrekursiv. Der zugehörige Berechnungsprozess ist ein sog. iterativer Prozess (oder Iteration). D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion endrekursive Lösungen lassen sich für viele Problemstellungen finden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion endrekursive Lösungen lassen sich für viele Problemstellungen finden Beispiel: Umdrehen einer Liste (s.a. reverse in Prelude.hs) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion endrekursive Lösungen lassen sich für viele Problemstellungen finden Beispiel: Umdrehen einer Liste (s.a. reverse in Prelude.hs) direkte rekursive Implementierung rev :: [a] -> [a] rev [] = [] rev (x:xs) = rev xs ++ [x] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste schematischer Ablauf bei direkter rekursiver Implementierung (vereinfacht) rev [1,2,3,4] rev [2,3,4] ++ [1] (rev [3,4] ++ [2]) ++ [1] ((rev [4] ++ [3]) ++ [2]) ++ [1] (((rev [] ++ [4]) ++ [3]) ++ [2]) ++ [1] ((([] ++ [4]) ++ [3]) ++ [2]) ++ [1] (([4] ++ [3]) ++ [2]) ++ [1] ([4,3] ++ [2]) ++ [1] [4,3,2] ++ [1] [4,3,2,1] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste schematischer Ablauf bei direkter rekursiver Implementierung (vereinfacht) rev [1,2,3,4] rev [2,3,4] ++ [1] (rev [3,4] ++ [2]) ++ [1] ((rev [4] ++ [3]) ++ [2]) ++ [1] (((rev [] ++ [4]) ++ [3]) ++ [2]) ++ [1] ((([] ++ [4]) ++ [3]) ++ [2]) ++ [1] (([4] ++ [3]) ++ [2]) ++ [1] ([4,3] ++ [2]) ++ [1] [4,3,2] ++ [1] [4,3,2,1] der Platzbedarf (für die offengebliebenen Kontexte) wächst hier linear in Abhängigkeit von Listenlänge n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste bei genauerer Betrachtung muss auch der Aufwand für die Konkatenation (d.h. ++) berücksichtigt werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste bei genauerer Betrachtung muss auch der Aufwand für die Konkatenation (d.h. ++) berücksichtigt werden Definition ) (++) :: [a] -> [a] -> [a] [] ++ y = y (x:xs) ++ y = x:(xs ++ y) D. Rösner -- (++.0) -- (++.1) AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste bei genauerer Betrachtung muss auch der Aufwand für die Konkatenation (d.h. ++) berücksichtigt werden Definition ) (++) :: [a] -> [a] -> [a] [] ++ y = y (x:xs) ++ y = x:(xs ++ y) -- (++.0) -- (++.1) m.a.W.: für eine nichtleere Liste x erfordert jede Anwendung von x ++ y einen Aufwand (gemessen in Anwendungen des :-Operators), der linear von der Listenlänge von x abhängt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Umdrehen einer Liste D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Umdrehen einer Liste Beispiel für Abarbeitung von x ++ y (vereinfacht) [4,3,2] ++ [1] -- mit (++.1) 4:([3,2] ++ [1]) -- mit (++.1) 4:(3:([2] ++ [1])) -- mit (++.1) 4:(3:(2:([] ++ [1]))) -- mit (++.1) 4:(3:(2:[1])) -- mit (++.0) 4:(3:[2,1]) -- Def. : 4:[3,2,1] -- Def. : [4,3,2,1] -- Def. : D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: endrekursive Variante für Umdrehen einer Liste D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: endrekursive Variante für Umdrehen einer Liste D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: endrekursive Variante für Umdrehen einer Liste Definition rev’ :: [a] -> [a] rev’ x = revAcc x [] -- (rev’) revAcc [] acc = acc -- (revAcc.0) revAcc (x:xs) acc = revAcc xs (x:acc) -- (revAcc.1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: endrekursive Variante für Umdrehen einer Liste Definition rev’ :: [a] -> [a] rev’ x = revAcc x [] -- (rev’) revAcc [] acc = acc -- (revAcc.0) revAcc (x:xs) acc = revAcc xs (x:acc) -- (revAcc.1) das Argument acc dient hier als Akkumulator für bereits erreichte Zwischenstände der Berechnung D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste schematischer Ablauf bei endrekursiver Variante (vereinfacht) rev’ [1,2,3] revAcc [1,2,3] [] revAcc [2,3] [1] revAcc [3] [2,1] revAcc [] [3,2,1] [3,2,1] D. Rösner ------ mit mit mit mit mit AuD 2008/2009 . . . (rev’) (revAcc.1) (revAcc.1) (revAcc.1) (revAcc.0) Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Endrekursion Beispiel: Umdrehen einer Liste schematischer Ablauf bei endrekursiver Variante (vereinfacht) rev’ [1,2,3] revAcc [1,2,3] [] revAcc [2,3] [1] revAcc [3] [2,1] revAcc [] [3,2,1] [3,2,1] ------ mit mit mit mit mit (rev’) (revAcc.1) (revAcc.1) (revAcc.1) (revAcc.0) der Platzbedarf ist, da keine Kontexte offen bleiben, hier konstant und unabhängig von Listenlänge n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: zur Modellierung von Gegenstandsbereichen stehen uns bisher zur Verfügung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: zur Modellierung von Gegenstandsbereichen stehen uns bisher zur Verfügung: die vordefinierten elementaren Typen, also Int, Float, String, usw. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: zur Modellierung von Gegenstandsbereichen stehen uns bisher zur Verfügung: die vordefinierten elementaren Typen, also Int, Float, String, usw. als aggregierte Typen: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: zur Modellierung von Gegenstandsbereichen stehen uns bisher zur Verfügung: die vordefinierten elementaren Typen, also Int, Float, String, usw. als aggregierte Typen: Listentypen: [a] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: zur Modellierung von Gegenstandsbereichen stehen uns bisher zur Verfügung: die vordefinierten elementaren Typen, also Int, Float, String, usw. als aggregierte Typen: Listentypen: [a] Tupeltypen: (a,b), (a,b,c), (a,b,c,d), . . . D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: zur Modellierung von Gegenstandsbereichen stehen uns bisher zur Verfügung: die vordefinierten elementaren Typen, also Int, Float, String, usw. als aggregierte Typen: Listentypen: [a] Tupeltypen: (a,b), (a,b,c), (a,b,c,d), . . . beliebige Kombinationen daraus, z.B. [[(String,Int,[Float])]]) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: zur Modellierung von Gegenstandsbereichen stehen uns bisher zur Verfügung: die vordefinierten elementaren Typen, also Int, Float, String, usw. als aggregierte Typen: Listentypen: [a] Tupeltypen: (a,b), (a,b,c), (a,b,c,d), . . . beliebige Kombinationen daraus, z.B. [[(String,Int,[Float])]]) damit lassen sich viele Beziehungen modellieren D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: Nachteile einer direkten Modellierung nur mit den elementaren Sprachmitteln: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: Nachteile einer direkten Modellierung nur mit den elementaren Sprachmitteln: mangelnde Abstraktion D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: Nachteile einer direkten Modellierung nur mit den elementaren Sprachmitteln: mangelnde Abstraktion insbesondere Semantik nicht explizit gemacht D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: Nachteile einer direkten Modellierung nur mit den elementaren Sprachmitteln: mangelnde Abstraktion insbesondere Semantik nicht explizit gemacht Beispiel: Wofür könnte [[(String,Int,[Float])]] alles stehen? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Datenstrukturen zur Modellierung: Nachteile einer direkten Modellierung nur mit den elementaren Sprachmitteln: mangelnde Abstraktion insbesondere Semantik nicht explizit gemacht Beispiel: Wofür könnte [[(String,Int,[Float])]] alles stehen? daher Repräsentation auch schwer zu modifizieren und weiterzuentwickeln D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: mit type lassen sich sog. Typsynonyme definieren D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: mit type lassen sich sog. Typsynonyme definieren Beispiel: type Student = (Name, Matrnr) type Name = String type Matrnr = Int D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: mit type lassen sich sog. Typsynonyme definieren Beispiel: type Student = (Name, Matrnr) type Name = String type Matrnr = Int allgemein: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: mit type lassen sich sog. Typsynonyme definieren Beispiel: type Student = (Name, Matrnr) type Name = String type Matrnr = Int allgemein: durch type <Name> = <Typ> wird <Name> als Typsynonym für <Typ> eingeführt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: mit type lassen sich sog. Typsynonyme definieren Beispiel: type Student = (Name, Matrnr) type Name = String type Matrnr = Int allgemein: durch type <Name> = <Typ> wird <Name> als Typsynonym für <Typ> eingeführt im Beispiel also der Typ Student als synonym zum Paartyp (Name, Matrnr), der wiederum synonym zu (String, Int) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Typsynonyme können – wie Typen – in Signaturen verwendet werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Typsynonyme können – wie Typen – in Signaturen verwendet werden Beispiel: Typsynonym Student um Komponente für Semesterzahl erweitert D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Typsynonyme können – wie Typen – in Signaturen verwendet werden Beispiel: Typsynonym Student um Komponente für Semesterzahl erweitert Beispiel type type type type Student = (Name, Matrnr, Semester) Name = String Matrnr = Int Semester = Int D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Typsynonyme können – wie Typen – in Signaturen verwendet werden Beispiel: Typsynonym Student um Komponente für Semesterzahl erweitert Beispiel type type type type Student = (Name, Matrnr, Semester) Name = String Matrnr = Int Semester = Int Funktion rueckmelden, die Semesterzahl erhöht D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Typsynonyme können – wie Typen – in Signaturen verwendet werden Beispiel: Typsynonym Student um Komponente für Semesterzahl erweitert Beispiel type type type type Student = (Name, Matrnr, Semester) Name = String Matrnr = Int Semester = Int Funktion rueckmelden, die Semesterzahl erhöht Beispiel rueckmelden :: Student -> Student rueckmelden (name, matr, sem) = (name, matr, sem+1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Typsynonyme können die intendierte Verwendung von Datenstrukturen im Programmcode deutlich machen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Typsynonyme können die intendierte Verwendung von Datenstrukturen im Programmcode deutlich machen sie führen aber nicht zu neuen, eigenständigen Datentypen, sondern können jederzeit in ihre Definition expandiert werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Typsynonyme können die intendierte Verwendung von Datenstrukturen im Programmcode deutlich machen sie führen aber nicht zu neuen, eigenständigen Datentypen, sondern können jederzeit in ihre Definition expandiert werden Beispiel: Definition von Instanzen stud1 = ("Mueller", 1234567, 3)::Student stud2 = ("Meier", 2345678, 1)::Student D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Typsynonyme können die intendierte Verwendung von Datenstrukturen im Programmcode deutlich machen sie führen aber nicht zu neuen, eigenständigen Datentypen, sondern können jederzeit in ihre Definition expandiert werden Beispiel: Definition von Instanzen stud1 = ("Mueller", 1234567, 3)::Student stud2 = ("Meier", 2345678, 1)::Student Beispiele einer Interaktion Main> stud1 ("Mueller",1234567,3) Main> rueckmelden stud1 ("Mueller",1234567,4) Main> stud1 ("Mueller",1234567,3) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typsynonyme zur Modellierung: Interaktion fortgesetzt: Main> map rueckmelden [stud1, stud2] [("Mueller",1234567,4),("Meier",2345678,2) Main> map (rueckmelden.rueckmelden) [stud1, stud2] [("Mueller",1234567,5),("Meier",2345678,3)] Main> :t rueckmelden rueckmelden :: Student -> Student Main> :t map (rueckmelden.rueckmelden) [stud1, stud2] map (rueckmelden . rueckmelden) [stud1,stud2] :: [([Char],Int,Int)] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Typen Algebraische Typen Aufzählungstypen (vgl. [Tho99], 14.1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Algebraische Typen Aufzählungstypen (vgl. [Tho99], 14.1) Beispiel: data Temp = Cold | Hot data Season = Spring | Summer | Autumn | Winter D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Algebraische Typen Aufzählungstypen (vgl. [Tho99], 14.1) Beispiel: data Temp = Cold | Hot data Season = Spring | Summer | Autumn | Winter Pattern matching zur Definition von Funktionen weather :: Season -> Temp weather Summer = Hot weather _ = Cold D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Algebraische Typen Aufzählungstypen (vgl. [Tho99], 14.1) Beispiel: data Temp = Cold | Hot data Season = Spring | Summer | Autumn | Winter Pattern matching zur Definition von Funktionen weather :: Season -> Temp weather Summer = Hot weather _ = Cold Definition von Gleichheit für Temp Cold == Hot == _ == Cold Hot _ = True = True = False D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen als algebraische Typen Typen mit Komponenten (sog. Produkttypen) als algebraische Typen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen als algebraische Typen Typen mit Komponenten (sog. Produkttypen) als algebraische Typen Beispiel: data People = Person Name Age type Name = String type Age = Int D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen als algebraische Typen Typen mit Komponenten (sog. Produkttypen) als algebraische Typen Beispiel: data People = Person Name Age type Name = String type Age = Int Beispiele: Person "Hans Mueller" 42 Person "Bart Simpson" 12 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen als algebraische Typen cont. Pattern matching zur Definition von Funktionen showPerson :: People -> String showPerson (Person st n) = st ++ " -- " ++ show n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen als algebraische Typen cont. Pattern matching zur Definition von Funktionen showPerson :: People -> String showPerson (Person st n) = st ++ " -- " ++ show n Konstruktor Person ist Funktion vom Typ Person :: Name -> Age -> People D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen mit Alternativen oft gibt es unterschiedliche Arten von Objekten, die zu einem Typ gehören D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen mit Alternativen oft gibt es unterschiedliche Arten von Objekten, die zu einem Typ gehören ein Geometrie-Programm könnte z.B. zunächst mit Kreisen und Rechtecken als geometrischen Objekten beginnen (s.a. [Tho99], 14.1) data GeoObj = Kreis Float| Rechteck Float Float D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen mit Alternativen oft gibt es unterschiedliche Arten von Objekten, die zu einem Typ gehören ein Geometrie-Programm könnte z.B. zunächst mit Kreisen und Rechtecken als geometrischen Objekten beginnen (s.a. [Tho99], 14.1) data GeoObj = Kreis Float| Rechteck Float Float hier gibt es also zwei Konstruktorfunktionen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen mit Alternativen oft gibt es unterschiedliche Arten von Objekten, die zu einem Typ gehören ein Geometrie-Programm könnte z.B. zunächst mit Kreisen und Rechtecken als geometrischen Objekten beginnen (s.a. [Tho99], 14.1) data GeoObj = Kreis Float| Rechteck Float Float hier gibt es also zwei Konstruktorfunktionen eine für Kreise mit Radius D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen mit Alternativen oft gibt es unterschiedliche Arten von Objekten, die zu einem Typ gehören ein Geometrie-Programm könnte z.B. zunächst mit Kreisen und Rechtecken als geometrischen Objekten beginnen (s.a. [Tho99], 14.1) data GeoObj = Kreis Float| Rechteck Float Float hier gibt es also zwei Konstruktorfunktionen eine für Kreise mit Radius eine für Rechtecke mit den beiden Seitenlängen für Länge und Breite D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen mit Alternativen Beispiel einer Interaktion D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen mit Alternativen Beispiel einer Interaktion Definition von Instanzen Kreis 5.0 Rechteck 12.4 29.7 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Produkttypen mit Alternativen Beispiel einer Interaktion Definition von Instanzen Kreis 5.0 Rechteck 12.4 29.7 Pattern matching bei Definition von Funktionen flaeche :: GeoObj -> Float flaeche (Kreis r) = pi*r*r flaeche (Rechteck laenge breite) = laenge*breite D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Rekursive algebraische Typen Beispiel: arithmetische Ausdrücke mit ganzen Zahlen data Expr = Lit Int| Add Expr Expr| Sub Expr Expr D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Rekursive algebraische Typen Beispiel: arithmetische Ausdrücke mit ganzen Zahlen data Expr = Lit Int| Add Expr Expr| Sub Expr Expr Beispiele: 7 4+7 (7-4)+11 Lit 7 Add (Lit 4) (Lit 7) Add (Sub (Lit 7)(Lit 4)) (Lit 11) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Rekursive algebraische Typen cont. Funktionen mit Hilfe primitiver Rekursion D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Rekursive algebraische Typen cont. Funktionen mit Hilfe primitiver Rekursion z.B. Auswerten eval :: Expr -> Int eval (Lit n) eval (Add e1 e2) eval (Sub e1 e2) D. Rösner = n = (eval e1) + (eval e2) = (eval e1) - (eval e2) AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Rekursive algebraische Typen cont. Beispiel: Bäume mit ganzen Zahlen data NTree = NilT | Node Int NTree NTree D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Rekursive algebraische Typen cont. Beispiel: Bäume mit ganzen Zahlen data NTree = NilT | Node Int NTree NTree Beispiele für Funktionen: sumTree, depth :: NTree -> Int sumTree NilT = 0 sumTree (Node n t1 t2) = n + sumTree t1 + sumTree t2 ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Aufzählungstypen EUKLIDProdukttypen Primzahltest Rekursive Datentypalgebraische Liste Strings Typen Lis Beispiele für Funktionen: cont. ... depth NilT = 0 depth (Node n t1 t2) = 1 + max (depth t1)(depth t2) occurs :: NTree -> Int -> Int occurs NilT p = 0 occurs (Node n t1 t2) p | n==p = 1 + occurs t1 p + occurs t2 p | otherwise = occurs t1 p + occurs t2 p D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Polymorphe algebraische Typen: Definitionen algebraischer Typen können Typvariable a, b, ... enthalten (vgl. [Tho99], 14.3) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Polymorphe algebraische Typen: Definitionen algebraischer Typen können Typvariable a, b, ... enthalten (vgl. [Tho99], 14.3) Beispiel: data Pairs a = Pr a a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Polymorphe algebraische Typen: Definitionen algebraischer Typen können Typvariable a, b, ... enthalten (vgl. [Tho99], 14.3) Beispiel: data Pairs a = Pr a a einige Ausprägungen: Pr 47 11 :: Pairs Int Pr [] [42] :: Pairs [Int] Pr [] [] :: Pairs [a] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Polymorphe algebraische Typen: Definitionen algebraischer Typen können Typvariable a, b, ... enthalten (vgl. [Tho99], 14.3) Beispiel: data Pairs a = Pr a a einige Ausprägungen: Pr 47 11 :: Pairs Int Pr [] [42] :: Pairs [Int] Pr [] [] :: Pairs [a] der eingebaute Listentyp könnte wie folgt definiert sein: data List a = NilList | Cons a (List a) deriving (Eq, Ord, Show, Read) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Binäre Bäume als polymorphe algebraische Typen die Elemente in den Knoten können von bel. Typ sein D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Binäre Bäume als polymorphe algebraische Typen die Elemente in den Knoten können von bel. Typ sein Beispiel: data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq, Ord, Show, Read) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Binäre Bäume als polymorphe algebraische Typen die Elemente in den Knoten können von bel. Typ sein Beispiel: data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq, Ord, Show, Read) Beispiel: depth :: Tree a -> Int depth Nil = 0 depth (Node n t1 t2) = 1 + max (depth t1)(depth t2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Binäre Bäume . . . aus Baum Liste ‘kollabieren’ bei Inorder-Traversierung collapse collapse collapse = :: Tree a -> [a] Nil = [] (Node n t1 t2) collapse t1 ++ [n] ++ collapse t2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Binäre Bäume . . . aus Baum Liste ‘kollabieren’ bei Inorder-Traversierung collapse collapse collapse = :: Tree a -> [a] Nil = [] (Node n t1 t2) collapse t1 ++ [n] ++ collapse t2 Beispiel: collapse (Node 7 (Node 4 Nil Nil) (Node 1 (Node 1 Nil Nil) Nil)) = [4,7,1,1] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Binäre Bäume . . . mapTree als Funktion höherer Ordnung auf binären Bäumen mapTree :: (a -> b) -> Tree a -> Tree b mapTree f Nil = Nil mapTree f (Node n t1 t2) = Node (f n) (mapTree f t1) (mapTree f t2) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: für Produkttypen gibt es eine alternative Syntax: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: für Produkttypen gibt es eine alternative Syntax: Beispiel: data Person’ = Person’ {name :: Name, age :: Age} deriving (Eq,Show,Read) type Name = String type Age = Int D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: für Produkttypen gibt es eine alternative Syntax: Beispiel: data Person’ = Person’ {name :: Name, age :: Age} deriving (Eq,Show,Read) type Name = String type Age = Int m.a.W.: statt einer ’positionalen’ Kodierung der Komponenten eines Produkttyps haben wir hier eine Kodierung mit benannten Selektoren D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante Instanzen werden kreiert mithilfe des Konstruktors und der benannten Selektoren D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante Instanzen werden kreiert mithilfe des Konstruktors und der benannten Selektoren Beispiel >p1 = Person’ {name = "Paul", age = 21} D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante Instanzen werden kreiert mithilfe des Konstruktors und der benannten Selektoren Beispiel >p1 = Person’ {name = "Paul", age = 21} da der Selektor die jeweilige Komponente eindeutig benennt, ist die Reihenfolge der Angaben beliebig D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante Instanzen werden kreiert mithilfe des Konstruktors und der benannten Selektoren Beispiel >p1 = Person’ {name = "Paul", age = 21} da der Selektor die jeweilige Komponente eindeutig benennt, ist die Reihenfolge der Angaben beliebig Beispiel >p2 = Person’ {age = 12, name = "Pauline"} D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante die Ausgabe durch die abgeleitete show-Funktion erfolgt aber in der Reihenfolge aus der data-Definition D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante die Ausgabe durch die abgeleitete show-Funktion erfolgt aber in der Reihenfolge aus der data-Definition Beispiel Main> p1 Person’{name="Paul",age=21} Main> p2 Person’{name="Pauline",age=12} D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante mit den benannten Selektorfunktionen kann auf die Werte der Komponenten zugegriffen werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante mit den benannten Selektorfunktionen kann auf die Werte der Komponenten zugegriffen werden Beispiel: Main> name p1 "Paul" Main> age p2 12 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante mit den benannten Selektorfunktionen kann auf die Werte der Komponenten zugegriffen werden Beispiel: Main> name p1 "Paul" Main> age p2 12 Konstruktor und Selektoren können in Funktionen zur Modifikation von Instanzen verwendet werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante mit den benannten Selektorfunktionen kann auf die Werte der Komponenten zugegriffen werden Beispiel: Main> name p1 "Paul" Main> age p2 12 Konstruktor und Selektoren können in Funktionen zur Modifikation von Instanzen verwendet werden Beispiel: hasBirthday :: Person’ -> Person’ hasBirthday p = Person’ {name= name p, age= age p + 1} D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Algebraische Typen: Variante beachte: bei der Modifikation wird eine modifizierte Kopie der Ausgangsinstanz kreiert, d.h. diese bleibt unverändert Beispiel: Main> p1 Person’{name="Paul",age=21} Main> hasBirthday p1 Person’{name="Paul",age=22} Main> p1 Person’{name="Paul",age=21} D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen polymorphe Typen wie a -> a sind allquantifiziert D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen polymorphe Typen wie a -> a sind allquantifiziert m.a.W.: a -> a ist zu lesen als: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen polymorphe Typen wie a -> a sind allquantifiziert m.a.W.: a -> a ist zu lesen als: für alle Typen a, eine Funktion, die Elemente vom Typ a auf Elemente vom Typ a abbildet D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen polymorphe Typen wie a -> a sind allquantifiziert m.a.W.: a -> a ist zu lesen als: für alle Typen a, eine Funktion, die Elemente vom Typ a auf Elemente vom Typ a abbildet qualifizierte Typen erlauben, die Quantifizierung auf eine Klasse von Typen einzuschränken D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen polymorphe Typen wie a -> a sind allquantifiziert m.a.W.: a -> a ist zu lesen als: für alle Typen a, eine Funktion, die Elemente vom Typ a auf Elemente vom Typ a abbildet qualifizierte Typen erlauben, die Quantifizierung auf eine Klasse von Typen einzuschränken Beispiel: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen polymorphe Typen wie a -> a sind allquantifiziert m.a.W.: a -> a ist zu lesen als: für alle Typen a, eine Funktion, die Elemente vom Typ a auf Elemente vom Typ a abbildet qualifizierte Typen erlauben, die Quantifizierung auf eine Klasse von Typen einzuschränken Beispiel: zur Klasse Num gehören u.a. die Typen Integer, Float, Complex D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen polymorphe Typen wie a -> a sind allquantifiziert m.a.W.: a -> a ist zu lesen als: für alle Typen a, eine Funktion, die Elemente vom Typ a auf Elemente vom Typ a abbildet qualifizierte Typen erlauben, die Quantifizierung auf eine Klasse von Typen einzuschränken Beispiel: zur Klasse Num gehören u.a. die Typen Integer, Float, Complex mit (+) :: Num a => a -> a -> a wird dann ausgedrückt: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen polymorphe Typen wie a -> a sind allquantifiziert m.a.W.: a -> a ist zu lesen als: für alle Typen a, eine Funktion, die Elemente vom Typ a auf Elemente vom Typ a abbildet qualifizierte Typen erlauben, die Quantifizierung auf eine Klasse von Typen einzuschränken Beispiel: zur Klasse Num gehören u.a. die Typen Integer, Float, Complex mit (+) :: Num a => a -> a -> a wird dann ausgedrückt: für alle Typen a, die zur Klasse Num gehören, hat (+) den Typ a -> a -> a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen polymorphe Typen wie a -> a sind allquantifiziert m.a.W.: a -> a ist zu lesen als: für alle Typen a, eine Funktion, die Elemente vom Typ a auf Elemente vom Typ a abbildet qualifizierte Typen erlauben, die Quantifizierung auf eine Klasse von Typen einzuschränken Beispiel: zur Klasse Num gehören u.a. die Typen Integer, Float, Complex mit (+) :: Num a => a -> a -> a wird dann ausgedrückt: für alle Typen a, die zur Klasse Num gehören, hat (+) den Typ a -> a -> a s.a. [Hud00], Ch. 12 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen Elemente einer Typklasse werden auch als Instanzen dieser Klasse bezeichnet D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen Elemente einer Typklasse werden auch als Instanzen dieser Klasse bezeichnet Typklassen wie Num a sollten nicht verwechselt werden mit Datentypen oder Konstruktoren in einem Datentyp wie Tree a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen Elemente einer Typklasse werden auch als Instanzen dieser Klasse bezeichnet Typklassen wie Num a sollten nicht verwechselt werden mit Datentypen oder Konstruktoren in einem Datentyp wie Tree a zusätzlich zu den vordefinierten Standard-Typklassen können auch Nutzer eigene Typklassen definieren D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Qualifizierte Typen Elemente einer Typklasse werden auch als Instanzen dieser Klasse bezeichnet Typklassen wie Num a sollten nicht verwechselt werden mit Datentypen oder Konstruktoren in einem Datentyp wie Tree a zusätzlich zu den vordefinierten Standard-Typklassen können auch Nutzer eigene Typklassen definieren s.a. [Hud00], Ch. 12 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Gleichheit zweier Ausdrücke e1 und e2 bedeutet in Haskell, dass der Wert von e1 und der Wert von e2 identisch sind D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Gleichheit zweier Ausdrücke e1 und e2 bedeutet in Haskell, dass der Wert von e1 und der Wert von e2 identisch sind alternative Sicht: wenn Gleichheit vorliegt, kann in einem Programm jedes Vorkommen von e1 durch e2 ersetzt werden, ohne das Programmresultat zu verändern D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Gleichheit zweier Ausdrücke e1 und e2 bedeutet in Haskell, dass der Wert von e1 und der Wert von e2 identisch sind alternative Sicht: wenn Gleichheit vorliegt, kann in einem Programm jedes Vorkommen von e1 durch e2 ersetzt werden, ohne das Programmresultat zu verändern Gleichheit zweier Ausdrücke in diesem Sinne lässt sich im Allgemeinen nicht durch Programme bestimmen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Gleichheit zweier Ausdrücke e1 und e2 bedeutet in Haskell, dass der Wert von e1 und der Wert von e2 identisch sind alternative Sicht: wenn Gleichheit vorliegt, kann in einem Programm jedes Vorkommen von e1 durch e2 ersetzt werden, ohne das Programmresultat zu verändern Gleichheit zweier Ausdrücke in diesem Sinne lässt sich im Allgemeinen nicht durch Programme bestimmen Beispiele: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Gleichheit zweier Ausdrücke e1 und e2 bedeutet in Haskell, dass der Wert von e1 und der Wert von e2 identisch sind alternative Sicht: wenn Gleichheit vorliegt, kann in einem Programm jedes Vorkommen von e1 durch e2 ersetzt werden, ohne das Programmresultat zu verändern Gleichheit zweier Ausdrücke in diesem Sinne lässt sich im Allgemeinen nicht durch Programme bestimmen Beispiele: Wann sind zwei unendliche Listen gleich? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Gleichheit zweier Ausdrücke e1 und e2 bedeutet in Haskell, dass der Wert von e1 und der Wert von e2 identisch sind alternative Sicht: wenn Gleichheit vorliegt, kann in einem Programm jedes Vorkommen von e1 durch e2 ersetzt werden, ohne das Programmresultat zu verändern Gleichheit zweier Ausdrücke in diesem Sinne lässt sich im Allgemeinen nicht durch Programme bestimmen Beispiele: Wann sind zwei unendliche Listen gleich? Wann sind zwei Funktionen vom Typ Integer -> Integer gleich? D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq man spricht von berechenbarer Gleichheit (engl. computational equality), wenn sich die Gleichheit zweier Werte tatsächlich ausrechnen lässt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq man spricht von berechenbarer Gleichheit (engl. computational equality), wenn sich die Gleichheit zweier Werte tatsächlich ausrechnen lässt die Klasse Eq enthält solche Typen, für die sich Gleichheit bestimmen lässt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq man spricht von berechenbarer Gleichheit (engl. computational equality), wenn sich die Gleichheit zweier Werte tatsächlich ausrechnen lässt die Klasse Eq enthält solche Typen, für die sich Gleichheit bestimmen lässt der Gleichheitsoperator hat dann den folgenden qualifizierten Typ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq man spricht von berechenbarer Gleichheit (engl. computational equality), wenn sich die Gleichheit zweier Werte tatsächlich ausrechnen lässt die Klasse Eq enthält solche Typen, für die sich Gleichheit bestimmen lässt der Gleichheitsoperator hat dann den folgenden qualifizierten Typ (==) :: Eq a => a -> a -> Bool D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq man spricht von berechenbarer Gleichheit (engl. computational equality), wenn sich die Gleichheit zweier Werte tatsächlich ausrechnen lässt die Klasse Eq enthält solche Typen, für die sich Gleichheit bestimmen lässt der Gleichheitsoperator hat dann den folgenden qualifizierten Typ (==) :: Eq a => a -> a -> Bool s.a. [Hud00], Ch. 12.1; [Tho99] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq die Bedingungen qualifizierter Typen (die sog. type constraints) übertragen sich auf polymorphe Datentypen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq die Bedingungen qualifizierter Typen (die sog. type constraints) übertragen sich auf polymorphe Datentypen m.a.W. da Integer, Char, Float Instanzen von Eq sind , sind es auch die Typen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq die Bedingungen qualifizierter Typen (die sog. type constraints) übertragen sich auf polymorphe Datentypen m.a.W. da Integer, Char, Float Instanzen von Eq sind , sind es auch die Typen (Integer, Char), D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq die Bedingungen qualifizierter Typen (die sog. type constraints) übertragen sich auf polymorphe Datentypen m.a.W. da Integer, Char, Float Instanzen von Eq sind , sind es auch die Typen (Integer, Char), [Integer], D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq die Bedingungen qualifizierter Typen (die sog. type constraints) übertragen sich auf polymorphe Datentypen m.a.W. da Integer, Char, Float Instanzen von Eq sind , sind es auch die Typen (Integer, Char), [Integer], [Float] usw. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Typbedingungen übertragen sich auch auf die Funktionen, in denen Operationen mit qualifiziertem Typ verwendet werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Typbedingungen übertragen sich auch auf die Funktionen, in denen Operationen mit qualifiziertem Typ verwendet werden Beispiel: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Typbedingungen übertragen sich auch auf die Funktionen, in denen Operationen mit qualifiziertem Typ verwendet werden Beispiel: elem :: Eq a => a -> [a] -> Bool D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Typbedingungen übertragen sich auch auf die Funktionen, in denen Operationen mit qualifiziertem Typ verwendet werden Beispiel: elem :: Eq a => a -> [a] -> Bool eine gesetzte Signatur elem :: a -> [a] -> Bool wäre zu allgemein und würde zu Typfehler führen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklasse Eq Typbedingungen übertragen sich auch auf die Funktionen, in denen Operationen mit qualifiziertem Typ verwendet werden Beispiel: elem :: Eq a => a -> [a] -> Bool eine gesetzte Signatur elem :: a -> [a] -> Bool wäre zu allgemein und würde zu Typfehler führen s.a. [Hud00], Ch. 12.1 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition der Typklasse Eq im Standard-Prelude findet sich eine Typklassen-Deklaration wie D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition der Typklasse Eq im Standard-Prelude findet sich eine Typklassen-Deklaration wie class Eq a where (==) :: a -> a-> Bool D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition der Typklasse Eq im Standard-Prelude findet sich eine Typklassen-Deklaration wie class Eq a where (==) :: a -> a-> Bool dies ist zu lesen als: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition der Typklasse Eq im Standard-Prelude findet sich eine Typklassen-Deklaration wie class Eq a where (==) :: a -> a-> Bool dies ist zu lesen als: ein Typ a ist nur dann eine Instanz der Klasse Eq, wenn für ihn eine Operation (==) :: a -> a-> Bool definiert ist D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition der Typklasse Eq im Standard-Prelude findet sich eine Typklassen-Deklaration wie class Eq a where (==) :: a -> a-> Bool dies ist zu lesen als: ein Typ a ist nur dann eine Instanz der Klasse Eq, wenn für ihn eine Operation (==) :: a -> a-> Bool definiert ist s.a. [Hud00], Ch. 12.2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Instanzen der Typklasse Eq mit der folgenden Instanzdeklaration wird spezifiziert, dass Integer eine Instanz von Eq ist D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Instanzen der Typklasse Eq mit der folgenden Instanzdeklaration wird spezifiziert, dass Integer eine Instanz von Eq ist instance Eq Integer where x == y = primEqInteger x y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Instanzen der Typklasse Eq mit der folgenden Instanzdeklaration wird spezifiziert, dass Integer eine Instanz von Eq ist instance Eq Integer where x == y = primEqInteger x y die Definition von (==) wird Methode genannt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Instanzen der Typklasse Eq mit der folgenden Instanzdeklaration wird spezifiziert, dass Integer eine Instanz von Eq ist instance Eq Integer where x == y = primEqInteger x y die Definition von (==) wird Methode genannt eine analoge Methode erlaubt dann den Vergleich von Gleitkommazahlen mit (==) instance Eq Float where x == y = primEqFloat x y D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Instanzen der Typklasse Eq auch eigendefinierte Datentypen können zu Instanzen von Eq gemacht werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Instanzen der Typklasse Eq auch eigendefinierte Datentypen können zu Instanzen von Eq gemacht werden Datentyp binärer Baum data Tree a = Leaf a | Branch (Tree a) (Tree a) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Instanzen der Typklasse Eq auch eigendefinierte Datentypen können zu Instanzen von Eq gemacht werden Datentyp binärer Baum data Tree a = Leaf a | Branch (Tree a) (Tree a) damit Blätter des Baumes verglichen werden können, muss der Typ der im Baum gespeicherten Werte aus Eq sein D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Instanzen der Typklasse Eq auch eigendefinierte Datentypen können zu Instanzen von Eq gemacht werden Datentyp binärer Baum data Tree a = Leaf a | Branch (Tree a) (Tree a) damit Blätter des Baumes verglichen werden können, muss der Typ der im Baum gespeicherten Werte aus Eq sein Bedingung in der Instanzdeklaration instance Eq a => Eq (Tree a) where Leaf a == Leaf b = a == b Branch l1 r1 == Branch l2 r2 = l1 == l2 && r1 == r2 _ == _ = False D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition der Typklasse Eq tatsächliche Definition von Eq im Standard-Prelude ist etwas umfangreicher und umfasst auch Test auf Ungleichheit D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition der Typklasse Eq tatsächliche Definition von Eq im Standard-Prelude ist etwas umfangreicher und umfasst auch Test auf Ungleichheit class Eq a where (==),(/=) :: a -> a-> Bool x /= y = not (x == y) x == y = not (x /= y) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition der Typklasse Eq tatsächliche Definition von Eq im Standard-Prelude ist etwas umfangreicher und umfasst auch Test auf Ungleichheit class Eq a where (==),(/=) :: a -> a-> Bool x /= y = not (x == y) x == y = not (x /= y) diese Methoden wirken als sog. Defaults (Voreinstellungswerte), falls eine Instanz nur eine der beiden Operationen definiert D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Definition der Typklasse Eq tatsächliche Definition von Eq im Standard-Prelude ist etwas umfangreicher und umfasst auch Test auf Ungleichheit class Eq a where (==),(/=) :: a -> a-> Bool x /= y = not (x == y) x == y = not (x /= y) diese Methoden wirken als sog. Defaults (Voreinstellungswerte), falls eine Instanz nur eine der beiden Operationen definiert s.a. [Hud00], Ch. 12.2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklassen vs. Polymorphismus Slogan: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklassen vs. Polymorphismus Slogan: Polymorphism captures similar structure over different values, D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklassen vs. Polymorphismus Slogan: Polymorphism captures similar structure over different values, while type classes capture similar operations over different structures. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklassen vs. Polymorphismus Slogan: Polymorphism captures similar structure over different values, while type classes capture similar operations over different structures. also: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklassen vs. Polymorphismus Slogan: Polymorphism captures similar structure over different values, while type classes capture similar operations over different structures. also: polymorphes List für Sequenzen von ganzen Zahlen, für Sequenzen von Zeichen, usw. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklassen vs. Polymorphismus Slogan: Polymorphism captures similar structure over different values, while type classes capture similar operations over different structures. also: polymorphes List für Sequenzen von ganzen Zahlen, für Sequenzen von Zeichen, usw. Typklasse Eq, um Test auf Gleichheit bereitzustellen für ganze Zahlen, für Bäume, usw. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Typklassen vs. Polymorphismus Slogan: Polymorphism captures similar structure over different values, while type classes capture similar operations over different structures. also: polymorphes List für Sequenzen von ganzen Zahlen, für Sequenzen von Zeichen, usw. Typklasse Eq, um Test auf Gleichheit bereitzustellen für ganze Zahlen, für Bäume, usw. s.a. [Hud00], Ch. 12.2, p. 152 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Motivation D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Motivation Wunsch nach Klasse Ord, welche die Operationen von Eq erbt, aber zusätzlich Vergleichsoperationen und Funktionen für Minimum und Maximum besitzt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Motivation Wunsch nach Klasse Ord, welche die Operationen von Eq erbt, aber zusätzlich Vergleichsoperationen und Funktionen für Minimum und Maximum besitzt mögliche Definition (vereinfacht, s.a. Prelude.hs): class Eq a => Ord a where (<),(<=),(>=),(>) :: a -> a-> Bool max, min :: a -> a-> a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Motivation Wunsch nach Klasse Ord, welche die Operationen von Eq erbt, aber zusätzlich Vergleichsoperationen und Funktionen für Minimum und Maximum besitzt mögliche Definition (vereinfacht, s.a. Prelude.hs): class Eq a => Ord a where (<),(<=),(>=),(>) :: a -> a-> Bool max, min :: a -> a-> a Sprechweise: Eq ist Superklasse von Ord bzw. Ord ist Subklasse von Eq (auch: Oberklasse bzw. Unterklasse) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Motivation Wunsch nach Klasse Ord, welche die Operationen von Eq erbt, aber zusätzlich Vergleichsoperationen und Funktionen für Minimum und Maximum besitzt mögliche Definition (vereinfacht, s.a. Prelude.hs): class Eq a => Ord a where (<),(<=),(>=),(>) :: a -> a-> Bool max, min :: a -> a-> a Sprechweise: Eq ist Superklasse von Ord bzw. Ord ist Subklasse von Eq (auch: Oberklasse bzw. Unterklasse) jeder Typ, der Instanz von Ord, muss auch Instanz von Eq sein D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Motivation Wunsch nach Klasse Ord, welche die Operationen von Eq erbt, aber zusätzlich Vergleichsoperationen und Funktionen für Minimum und Maximum besitzt mögliche Definition (vereinfacht, s.a. Prelude.hs): class Eq a => Ord a where (<),(<=),(>=),(>) :: a -> a-> Bool max, min :: a -> a-> a Sprechweise: Eq ist Superklasse von Ord bzw. Ord ist Subklasse von Eq (auch: Oberklasse bzw. Unterklasse) jeder Typ, der Instanz von Ord, muss auch Instanz von Eq sein s.a. [Hud00], Ch. 12.3 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen mit folgender Instanzdeklaration wird der Datentyp für Bäume (also Tree a) zu Instanz von Ord für solche Elementtypen a, die selbst zu Ord gehören D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen mit folgender Instanzdeklaration wird der Datentyp für Bäume (also Tree a) zu Instanz von Ord für solche Elementtypen a, die selbst zu Ord gehören instance Leaf _ Leaf a Branch Branch Ord a => Ord (Tree a) where < Branch _ _ = < Leaf b = _ _ < Leaf _ = l1 r1 < Branch l2 r2 = t1 <= t2 True a < b False l1 < l2 && r1 < r2 = t1 < t2 || t1 == t2 ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen mit folgender Instanzdeklaration wird der Datentyp für Bäume (also Tree a) zu Instanz von Ord für solche Elementtypen a, die selbst zu Ord gehören instance Leaf _ Leaf a Branch Branch Ord a => Ord (Tree a) where < Branch _ _ = < Leaf b = _ _ < Leaf _ = l1 r1 < Branch l2 r2 = t1 <= t2 True a < b False l1 < l2 && r1 < r2 = t1 < t2 || t1 == t2 ... funktioniert in dieser Form, da Tree bereits Instanz von Eq D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen mit folgender Instanzdeklaration wird der Datentyp für Bäume (also Tree a) zu Instanz von Ord für solche Elementtypen a, die selbst zu Ord gehören instance Leaf _ Leaf a Branch Branch Ord a => Ord (Tree a) where < Branch _ _ = < Leaf b = _ _ < Leaf _ = l1 r1 < Branch l2 r2 = t1 <= t2 True a < b False l1 < l2 && r1 < r2 = t1 < t2 || t1 == t2 ... funktioniert in dieser Form, da Tree bereits Instanz von Eq s.a. [Hud00], Ch. 12.3 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen aufgrund der Vererbung zwischen Typklassen können Typbedingungen in Signaturen von Funktionen kompakter formuliert werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen aufgrund der Vererbung zwischen Typklassen können Typbedingungen in Signaturen von Funktionen kompakter formuliert werden Beispiel: bei einer Funktion, die Operationen sowohl aus Eq, als auch aus Ord verwendet, reicht in der Signatur die Bedingung Ord a statt (Eq a,Ord a) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen aufgrund der Vererbung zwischen Typklassen können Typbedingungen in Signaturen von Funktionen kompakter formuliert werden Beispiel: bei einer Funktion, die Operationen sowohl aus Eq, als auch aus Ord verwendet, reicht in der Signatur die Bedingung Ord a statt (Eq a,Ord a) hierzu D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen aufgrund der Vererbung zwischen Typklassen können Typbedingungen in Signaturen von Funktionen kompakter formuliert werden Beispiel: bei einer Funktion, die Operationen sowohl aus Eq, als auch aus Ord verwendet, reicht in der Signatur die Bedingung Ord a statt (Eq a,Ord a) hierzu Beispiel D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen aufgrund der Vererbung zwischen Typklassen können Typbedingungen in Signaturen von Funktionen kompakter formuliert werden Beispiel: bei einer Funktion, die Operationen sowohl aus Eq, als auch aus Ord verwendet, reicht in der Signatur die Bedingung Ord a statt (Eq a,Ord a) hierzu Beispiel generische Sortierfunktionen wie quicksort D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen aufgrund der Vererbung zwischen Typklassen können Typbedingungen in Signaturen von Funktionen kompakter formuliert werden Beispiel: bei einer Funktion, die Operationen sowohl aus Eq, als auch aus Ord verwendet, reicht in der Signatur die Bedingung Ord a statt (Eq a,Ord a) hierzu Beispiel generische Sortierfunktionen wie quicksort quicksort :: Ord a => [a] -> [a] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen aufgrund der Vererbung zwischen Typklassen können Typbedingungen in Signaturen von Funktionen kompakter formuliert werden Beispiel: bei einer Funktion, die Operationen sowohl aus Eq, als auch aus Ord verwendet, reicht in der Signatur die Bedingung Ord a statt (Eq a,Ord a) hierzu Beispiel generische Sortierfunktionen wie quicksort quicksort :: Ord a => [a] -> [a] s.a. [Hud00], Ch. 12.3 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen multiple Vererbung (Mehrfachvererbung) von Operationen aus mehreren Typklassen ist möglich D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen multiple Vererbung (Mehrfachvererbung) von Operationen aus mehreren Typklassen ist möglich Namenskonflikte werden durch die Bedingung ausgeschlossen, dass eine bestimmte Operation in jedem beliebigen Skopus nur Element in höchstens einer Klasse sein kann D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen multiple Vererbung (Mehrfachvererbung) von Operationen aus mehreren Typklassen ist möglich Namenskonflikte werden durch die Bedingung ausgeschlossen, dass eine bestimmte Operation in jedem beliebigen Skopus nur Element in höchstens einer Klasse sein kann also: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen multiple Vererbung (Mehrfachvererbung) von Operationen aus mehreren Typklassen ist möglich Namenskonflikte werden durch die Bedingung ausgeschlossen, dass eine bestimmte Operation in jedem beliebigen Skopus nur Element in höchstens einer Klasse sein kann also: Beispiel (für multiple Vererbung) class (Eq a,Show a) => C a where ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen multiple Vererbung (Mehrfachvererbung) von Operationen aus mehreren Typklassen ist möglich Namenskonflikte werden durch die Bedingung ausgeschlossen, dass eine bestimmte Operation in jedem beliebigen Skopus nur Element in höchstens einer Klasse sein kann also: Beispiel (für multiple Vererbung) class (Eq a,Show a) => C a where ... s.a. [Hud00], Ch. 12.3 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Methoden in einer Klasse können zusätzliche Klassenbedingungen für jede beliebige verwendete Typvariable haben, ausgenommen für die Variable, die in der zu definierenden Klasse selbst verwendet wird D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Methoden in einer Klasse können zusätzliche Klassenbedingungen für jede beliebige verwendete Typvariable haben, ausgenommen für die Variable, die in der zu definierenden Klasse selbst verwendet wird hierzu D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Methoden in einer Klasse können zusätzliche Klassenbedingungen für jede beliebige verwendete Typvariable haben, ausgenommen für die Variable, die in der zu definierenden Klasse selbst verwendet wird hierzu Beispiel (für zusätzliche Klassenbedingungen) class C a where m :: Eq b => a -> b D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Vererbung bei Typklassen Methoden in einer Klasse können zusätzliche Klassenbedingungen für jede beliebige verwendete Typvariable haben, ausgenommen für die Variable, die in der zu definierenden Klasse selbst verwendet wird hierzu Beispiel (für zusätzliche Klassenbedingungen) class C a where m :: Eq b => a -> b s.a. [Hud00], Ch. 12.3 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden bestimmte Methoden in einer Klasse können automatisch abgeleitet werden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden bestimmte Methoden in einer Klasse können automatisch abgeleitet werden vgl. Definition von Gleichheit für Bäume D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden bestimmte Methoden in einer Klasse können automatisch abgeleitet werden vgl. Definition von Gleichheit für Bäume Beispiel (für kanonische Definition von Gleichheit) instance Eq a => Eq (Tree a) where Leaf a == Leaf b = a == b Branch l1 r1 == Branch l2 r2 = l1 == l2 && r1 == r2 _ == _ = False D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden vgl. Definition von Gleichheit für Bäume D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden vgl. Definition von Gleichheit für Bäume verbal: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden vgl. Definition von Gleichheit für Bäume verbal: Beispiel D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden vgl. Definition von Gleichheit für Bäume verbal: Beispiel zwei Blätter sind genau dann gleich, wenn ihre Inhalte gleich sind D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden vgl. Definition von Gleichheit für Bäume verbal: Beispiel zwei Blätter sind genau dann gleich, wenn ihre Inhalte gleich sind zwei Verzweigungen sind genau dann gleich, wenn ihre linken und rechten Teilbäume jeweils gleich sind D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden vgl. Definition von Gleichheit für Bäume verbal: Beispiel zwei Blätter sind genau dann gleich, wenn ihre Inhalte gleich sind zwei Verzweigungen sind genau dann gleich, wenn ihre linken und rechten Teilbäume jeweils gleich sind in allen anderen Fällen sind zwei Bäume ungleich D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden vgl. Definition von Gleichheit für Bäume verbal: Beispiel zwei Blätter sind genau dann gleich, wenn ihre Inhalte gleich sind zwei Verzweigungen sind genau dann gleich, wenn ihre linken und rechten Teilbäume jeweils gleich sind in allen anderen Fällen sind zwei Bäume ungleich eine solche kanonische Definition von Gleichheit lässt sich automatisch auf andere definierte Datentypen übertragen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung EUKLID Primzahltest Datentyp Liste Strings Lis Ableitung von Methoden vgl. Definition von Gleichheit für Bäume verbal: Beispiel zwei Blätter sind genau dann gleich, wenn ihre Inhalte gleich sind zwei Verzweigungen sind genau dann gleich, wenn ihre linken und rechten Teilbäume jeweils gleich sind in allen anderen Fällen sind zwei Bäume ungleich eine solche kanonische Definition von Gleichheit lässt sich automatisch auf andere definierte Datentypen übertragen s.a. [Hud00], Ch. 12.5 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Weitere Typklassen zur vollständigen Spezifikation von Ord gehört D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Weitere Typklassen zur vollständigen Spezifikation von Ord gehört Definition class Eq a => Ord a where compare :: a -> a -> Ordering (<),(<=),(>=),(>) :: a -> a -> Bool max, min :: a -> a -> a D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Weitere Typklassen zur vollständigen Spezifikation von Ord gehört Definition class Eq a => Ord a where compare :: a -> a -> Ordering (<),(<=),(>=),(>) :: a -> a -> Bool max, min :: a -> a -> a s.a. [Tho99], Ch. 14; [Hud00], Ch. 24 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord der Datentyp Ordering D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord der Datentyp Ordering Definition data Ordering = LT|EQ|GT deriving (Eq, Ord, Enum, Read, Show, Bounded) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord der Datentyp Ordering Definition data Ordering = LT|EQ|GT deriving (Eq, Ord, Enum, Read, Show, Bounded) Ordering enthält die drei möglichen Werte für Vergleiche zwischen zwei beliebigen Objekten gleichen Ordnungs-Typs: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord der Datentyp Ordering Definition data Ordering = LT|EQ|GT deriving (Eq, Ord, Enum, Read, Show, Bounded) Ordering enthält die drei möglichen Werte für Vergleiche zwischen zwei beliebigen Objekten gleichen Ordnungs-Typs: Kleiner-Beziehung: LT D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord der Datentyp Ordering Definition data Ordering = LT|EQ|GT deriving (Eq, Ord, Enum, Read, Show, Bounded) Ordering enthält die drei möglichen Werte für Vergleiche zwischen zwei beliebigen Objekten gleichen Ordnungs-Typs: Kleiner-Beziehung: LT Gleichheit: EQ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord der Datentyp Ordering Definition data Ordering = LT|EQ|GT deriving (Eq, Ord, Enum, Read, Show, Bounded) Ordering enthält die drei möglichen Werte für Vergleiche zwischen zwei beliebigen Objekten gleichen Ordnungs-Typs: Kleiner-Beziehung: LT Gleichheit: EQ Grösser-Beziehung: GT D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord die Funktion compare ordnet zwei beliebigen Objekten gleichen Ordnungs-Typs einen der drei Werte aus Ordering zu D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord die Funktion compare ordnet zwei beliebigen Objekten gleichen Ordnungs-Typs einen der drei Werte aus Ordering zu die Default-Definition in Klasse Ord benutzt den Operator (<=) aus Ord und den Operator (==) aus Eq D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord die Funktion compare ordnet zwei beliebigen Objekten gleichen Ordnungs-Typs einen der drei Werte aus Ordering zu die Default-Definition in Klasse Ord benutzt den Operator (<=) aus Ord und den Operator (==) aus Eq Definition (aus Spezifikation von Klasse Ord in Prelude.hs) compare x y | x==y = EQ | x<=y = LT | otherwise = GT D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord umgekehrt ist die Default-Methode für (<=) (und weiterer Operatoren) definiert unter Verwendung von compare D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord umgekehrt ist die Default-Methode für (<=) (und weiterer Operatoren) definiert unter Verwendung von compare Definition (aus Spezifikation von Klasse Ord in Prelude.hs) x x x x <= < >= > y y y y = = = = D. Rösner compare compare compare compare AuD 2008/2009 . . . x x x x y y y y /= == /= == GT LT LT GT Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Ordungsklasse Ord umgekehrt ist die Default-Methode für (<=) (und weiterer Operatoren) definiert unter Verwendung von compare Definition (aus Spezifikation von Klasse Ord in Prelude.hs) x x x x <= < >= > y y y y = = = = compare compare compare compare x x x x y y y y /= == /= == GT LT LT GT Konsequenz: eine Instanz von Ord sollte zumindest eine eigene Definition für den Operator (<=) oder für die Funktion compare besitzen, um wohldefiniert zu sein D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Weitere Typklassen die Klasse Enum umfasst Methoden, die das Prinzip arithmetischer Sequenzen und die entsprechenden Kurzschreibweisen auf andere aufzählbare Typen übertragen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Weitere Typklassen die Klasse Enum umfasst Methoden, die das Prinzip arithmetischer Sequenzen und die entsprechenden Kurzschreibweisen auf andere aufzählbare Typen übertragen Beispiel: data Color = Red|Orange|Yellow|Green |Blue|Indigo|Violet D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Weitere Typklassen die Klasse Enum umfasst Methoden, die das Prinzip arithmetischer Sequenzen und die entsprechenden Kurzschreibweisen auf andere aufzählbare Typen übertragen Beispiel: data Color = Red|Orange|Yellow|Green |Blue|Indigo|Violet wird Color zur Instanz von Enum gemacht, dann (vgl. [Hud00], Ch. 24): [Red .. Violet] ==> [Red,Orange,Yellow,Green,Blue,Indigo,Violet] [Red,Yellow ..] ==> ... fromEnum Green ==> 3 toEnum 5::Color ==> ... D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Enumeration die Spezifikation von Enum (vgl. Prelude.hs): class Enum a where succ, pred toEnum fromEnum enumFrom enumFromThen enumFromTo enumFromThenTo :: :: :: :: :: :: :: a -> a Int -> a a -> Int a -> [a] a -> a -> [a] a -> a -> [a] a -> a -> a -> [a] D. Rösner AuD 2008/2009 . . . ----- [n..] [n,m..] [n..m] [n,n’..m] Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Enumeration Default-Methoden von Enum (vgl. Prelude.hs): -- Minimal complete definition: toEnum, fromEnum succ = toEnum . (1+) . fromEnum pred = toEnum . subtract 1 . fromEnum enumFrom x = map toEnum [fromEnum x ..] enumFromThen x y = map toEnum [fromEnum x,fromEnum y ..] enumFromTo x y = map toEnum [fromEnum x .. fromEnum y] enumFromThenTo x y z = map toEnum [fromEnum x,fromEnum y .. fromEnum z] D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Enumeration für die Deklaration eigener Instanzen sind diese vordefinierten Methoden normalerweise ausreichend D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Enumeration für die Deklaration eigener Instanzen sind diese vordefinierten Methoden normalerweise ausreichend es müssen lediglich definiert werden: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Enumeration für die Deklaration eigener Instanzen sind diese vordefinierten Methoden normalerweise ausreichend es müssen lediglich definiert werden: toEnum D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Enumeration für die Deklaration eigener Instanzen sind diese vordefinierten Methoden normalerweise ausreichend es müssen lediglich definiert werden: toEnum fromEnum D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Enumeration für die Deklaration eigener Instanzen sind diese vordefinierten Methoden normalerweise ausreichend es müssen lediglich definiert werden: toEnum fromEnum für Aufzählungstypen kann man sich auch völlig auf Ableitung durch eine entsprechende deriving-Klausel stützen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Enumeration für die Deklaration eigener Instanzen sind diese vordefinierten Methoden normalerweise ausreichend es müssen lediglich definiert werden: toEnum fromEnum für Aufzählungstypen kann man sich auch völlig auf Ableitung durch eine entsprechende deriving-Klausel stützen Beispiel: data Color = Red|Orange|Yellow|Green |Blue|Indigo|Violet deriving (Eq, Ord, Enum, Show, Read) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Show, Read mit der Methode show aus der Typklasse Show wird einem Datenobjekt aus einer Instanz von Show ein String (eine sog. textuelle Repräsentation) zugeordnet D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Show, Read mit der Methode show aus der Typklasse Show wird einem Datenobjekt aus einer Instanz von Show ein String (eine sog. textuelle Repräsentation) zugeordnet mit der Methode read aus der Typklasse Read wird eine textuelle Repräsentation (ein String) geparst und daraus ein Datenobjekt einer Instanz von Read gewonnen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Show, Read Beispiele: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Show, Read Beispiele: Main> show GT "GT" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Show, Read Beispiele: Main> show GT "GT" Main> read "GT"::Ordering GT D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Show, Read Beispiele: Main> show GT "GT" Main> read "GT"::Ordering GT Main> show Red "Red" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Show, Read Beispiele: Main> "GT" Main> GT Main> "Red" Main> Red show GT read "GT"::Ordering show Red read "Red"::Color D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Ord Enum EUKLID Show, Read Primzahltest Datentyp Liste Strings Lis Show, Read Beispiele: Main> "GT" Main> GT Main> "Red" Main> Red show GT read "GT"::Ordering show Red read "Red"::Color Beachte: Umgang mit Strings Main> read "\"Red\""::String "Red" Main> show "Red" "\"Red\"" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: manchmal gibt es für ein Problem effizientere rekursive Lösungen als die unmittelbar sich anbietenden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: manchmal gibt es für ein Problem effizientere rekursive Lösungen als die unmittelbar sich anbietenden Beispiel: Exponentiation D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: manchmal gibt es für ein Problem effizientere rekursive Lösungen als die unmittelbar sich anbietenden Beispiel: Exponentiation aus der Definition ergeben sich die folgenden rekursiven Beziehungen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: manchmal gibt es für ein Problem effizientere rekursive Lösungen als die unmittelbar sich anbietenden Beispiel: Exponentiation aus der Definition ergeben sich die folgenden rekursiven Beziehungen Anfangswert: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: manchmal gibt es für ein Problem effizientere rekursive Lösungen als die unmittelbar sich anbietenden Beispiel: Exponentiation aus der Definition ergeben sich die folgenden rekursiven Beziehungen Anfangswert: für alle x: x 0 = 1 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: manchmal gibt es für ein Problem effizientere rekursive Lösungen als die unmittelbar sich anbietenden Beispiel: Exponentiation aus der Definition ergeben sich die folgenden rekursiven Beziehungen Anfangswert: für alle x: x 0 = 1 für alle anderen Werte (d.h. für n ≥ 1) gilt die folgende rekursive Definition: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: manchmal gibt es für ein Problem effizientere rekursive Lösungen als die unmittelbar sich anbietenden Beispiel: Exponentiation aus der Definition ergeben sich die folgenden rekursiven Beziehungen Anfangswert: für alle x: x 0 = 1 für alle anderen Werte (d.h. für n ≥ 1) gilt die folgende rekursive Definition: x n = x ∗ x n−1 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: rekursive Beziehung direkt umgesetzt in eine Haskell-Funktion (vgl. auch Prelude.hs): (^) :: Float -> Int -> Float x^0 = 1 x^n = x* x^(n-1} D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: rekursive Beziehung direkt umgesetzt in eine Haskell-Funktion (vgl. auch Prelude.hs): (^) :: Float -> Int -> Float x^0 = 1 x^n = x* x^(n-1} Nachteil dieser direkten Lösung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: rekursive Beziehung direkt umgesetzt in eine Haskell-Funktion (vgl. auch Prelude.hs): (^) :: Float -> Int -> Float x^0 = 1 x^n = x* x^(n-1} Nachteil dieser direkten Lösung: der Aufwand (gemessen in Anzahl der Multiplikationen) ist linear in Bezug auf n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: die folgenden rekursiven Beziehungen erlauben eine Verringerung des Aufwands D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: die folgenden rekursiven Beziehungen erlauben eine Verringerung des Aufwands x0 = 1 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: die folgenden rekursiven Beziehungen erlauben eine Verringerung des Aufwands x0 = 1 für n >= 2 gerade: x n = x n/2 ∗ x n/2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: die folgenden rekursiven Beziehungen erlauben eine Verringerung des Aufwands x0 = 1 für n >= 2 gerade: x n = x n/2 ∗ x n/2 für n >= 1 ungerade: x n = x ∗ x (n−1)/2 ∗ x (n−1)/2 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: bei der Umsetzung in eine Haskell-Funktion wird die wiederholte Berechnung der Teilprodukte x n/2 bzw. x (n−1)/2 vermieden D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: bei der Umsetzung in eine Haskell-Funktion wird die wiederholte Berechnung der Teilprodukte x n/2 bzw. x (n−1)/2 vermieden damit: (^) :: Float -> Int -> Float x^0 = 1 x^n | n ‘mod‘ 2 == 0 = let xn2 = x^(div n 2) in xn2*xn2 | otherwise = let xn2’ = x^(div (n-1) 2) in x*xn2’*xn2’ D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: der Aufwand (gemessen in Anzahl der Multiplikationen) ist nun nur noch logarithmisch in Bezug auf n D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: der Aufwand (gemessen in Anzahl der Multiplikationen) ist nun nur noch logarithmisch in Bezug auf n Begründung: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: der Aufwand (gemessen in Anzahl der Multiplikationen) ist nun nur noch logarithmisch in Bezug auf n Begründung: Betrachte zunächst Spezialfall n=2^k für k>=1: D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: der Aufwand (gemessen in Anzahl der Multiplikationen) ist nun nur noch logarithmisch in Bezug auf n Begründung: Betrachte zunächst Spezialfall n=2^k für k>=1: in k = log n Schritten ist Fall x^0 erreicht D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: der Aufwand (gemessen in Anzahl der Multiplikationen) ist nun nur noch logarithmisch in Bezug auf n Begründung: Betrachte zunächst Spezialfall n=2^k für k>=1: in k = log n Schritten ist Fall x^0 erreicht Sei dann n beliebig. Dann ex. ein k mit 2^(k+1) > n >= 2^k. Nach spätestens k Reduktionsschritten (s.o.) ist dann der Fall x^0 erreicht. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: der Aufwand (gemessen in Anzahl der Multiplikationen) ist nun nur noch logarithmisch in Bezug auf n Begründung: Betrachte zunächst Spezialfall n=2^k für k>=1: in k = log n Schritten ist Fall x^0 erreicht Sei dann n beliebig. Dann ex. ein k mit 2^(k+1) > n >= 2^k. Nach spätestens k Reduktionsschritten (s.o.) ist dann der Fall x^0 erreicht. Zusammengefasst: Aufwand ist O(log(n)) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: die Implementation im Prelude.hs verbindet das obige ’Halbierungsverfahren’ noch mit Endrekursion D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: die Implementation im Prelude.hs verbindet das obige ’Halbierungsverfahren’ noch mit Endrekursion Beispiel (^) :: (Num a, Integral b) => a -> b -> a x ^ 0 = 1 x ^ n | n > 0 = f x (n-1) x where f _ 0 y = y f x n y = g x n where g x n |even n = g (x*x) (n‘quot‘2) |otherwise = f x (n-1) (x*y) _ ^ _ = error "Prelude.^: negative exponent" D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: direkte Implementierung einer Funktion, die den Durchschnitt einer Liste mit Zahlenwerten berechnet D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: direkte Implementierung einer Funktion, die den Durchschnitt einer Liste mit Zahlenwerten berechnet Beispiel average xs = sum xs / fromInteger (length xs) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: direkte Implementierung einer Funktion, die den Durchschnitt einer Liste mit Zahlenwerten berechnet Beispiel average xs = sum xs / fromInteger (length xs) die Liste xs wird bei dieser Implementierung zweimal durchlaufen D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: direkte Implementierung einer Funktion, die den Durchschnitt einer Liste mit Zahlenwerten berechnet Beispiel average xs = sum xs / fromInteger (length xs) die Liste xs wird bei dieser Implementierung zweimal durchlaufen s.a. [RL99], 4.1.6 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: Durchschnitt einer Liste mit Zahlenwerten D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: Durchschnitt einer Liste mit Zahlenwerten hier: Endrekursive Lösung D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: Durchschnitt einer Liste mit Zahlenwerten hier: Endrekursive Lösung dabei Hilfsfunktion, die beide Parameter in Akkumulatoren sammelt D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: Durchschnitt einer Liste mit Zahlenwerten hier: Endrekursive Lösung dabei Hilfsfunktion, die beide Parameter in Akkumulatoren sammelt Beispiel average’ xs = av’ xs 0 0 where av’ [] s n = s / fromInteger n av’ (x:xs) s n = av’ xs (x+s) (n+1) D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: Durchschnitt einer Liste mit Zahlenwerten hier: Endrekursive Lösung dabei Hilfsfunktion, die beide Parameter in Akkumulatoren sammelt Beispiel average’ xs = av’ xs 0 0 where av’ [] s n = s / fromInteger n av’ (x:xs) s n = av’ xs (x+s) (n+1) nur einmaliges Durchlaufen der Liste und – wegen der Endrekursion – konstanter Platzbedarf D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Aufwandreduktion: Vermeiden von Listentraversierungen Beispiel: Durchschnitt einer Liste mit Zahlenwerten hier: Endrekursive Lösung dabei Hilfsfunktion, die beide Parameter in Akkumulatoren sammelt Beispiel average’ xs = av’ xs 0 0 where av’ [] s n = s / fromInteger n av’ (x:xs) s n = av’ xs (x+s) (n+1) nur einmaliges Durchlaufen der Liste und – wegen der Endrekursion – konstanter Platzbedarf s.a. [RL99], 4.1.6 D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Literatur: I Harold Abelson, G.J.Sussman, and J.Sussman. Structure and Interpretation of Computer Programs. MIT Press, Cambridge, MA, USA, 1996. 2nd edition; Bem.: dt. Übersetzung existiert, aber engl. Original ist mehr zu empfehlen – DR. W. Brauer and S. Münch. Studien- und Forschungsführer Informatik. Springer, Heidelberg, 1996. 3. Auflage. Michael T. Goodrich and Roberto Tamassia. Data Structures and Algorithms in Java. John Wiley & Sons, New York, 2001. ISBN 0-471-38367-8; 2nd edition. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Literatur: II Paul Hudak. The Haskell School of Expression – Learning Functional Programming through Multimedia. Cambridge University Press, Cambridge, UK, 2000. ISBN 0-521-64338-4. Herbert Klaeren and Michael Sperber. Die Macht der Abstraktion – Einführung in die Programmierung. Teubner, Wiesbaden, 2007. ISBN-13 978-3-8351-0155-5. Gustav Pomberger and Heinz Dobler. Algorithmen und Datenstrukturen – Eine systematische Einführung in die Programmierung. Pearson Education Dtl. GmbH, München, 2008. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Literatur: III Peter Pepper and Petra Hofstedt. Funktionale Programmierung – Sprachdesign und Programmiertechnik. Springer, Heidelberg, 2006. ISBN-10 3-540-20959-X; ISBN-13 978-3-540-20959-1. Fethi Rabhi and Guy Lapalme. Algorithms – A Functional Programming Approach. Pearson Education Ltd., Essex, 1999. 2nd edition, ISBN 0-201-59604-0. Gunter Saake and Kai-Uwe Sattler. Algorithmen und Datenstrukturen – Eine Einführung mit Java. dpunkt.verlag, Heidelberg, 2002. ISBN 3-89864-122-8. D. Rösner AuD 2008/2009 . . . Einleitung Vorgeschichte Einleitung Skripte Sprachelemente Einleitung Beispiel Exponentiation EUKLID Primzahltest Listentraversierungen Datentyp Liste Strings Lis Literatur: IV Simon Thompson. Haskell - The Craft of Functional Programming. Addison Wesley Longman Ltd., Essex, 1999. 2nd edition, ISBN 0-201-34275-8; Accompanying Web site: http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e. D. Rösner AuD 2008/2009 . . .