Algorithmen und Datenstrukturen

Werbung
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 . . .
Herunterladen