Haskell

Werbung
Grundlagen der Programmierung 2:
Geplanter Inhalt der ersten Hälfte
Grundlagen der Programmierung 2
•
•
•
•
•
•
Prof. Dr. Manfred Schmidt-Schauß
Künstliche Intelligenz und Softwaretechnologie
17. April 2013
•
1
Bücher, Literatur, URLs
rekursives Programmieren in Haskell
Auswertung in Haskell
Programmieren mit Listen
Datenstrukturen: Bäume
Polymorphe Typen und Typklassen
Compilerbau;
◦
Lexer
◦
Parser
◦
Kombinator-Parser
◦
Kode-Erzeugung; abstrakte Maschinen
◦
Shift-Reduce Parser und Compiler-Generatoren
◦
Compiler-Generatoren
(Semantik)
Haskell
Haskell und funktionale Programmierung:
•
http://www-stud.informatik.uni-frankfurt.de/˜prg2
insbesondere das Skript zur Vorlesung
•
www.haskell.org
•
http://haskell.org/onlinereport/
•
•
•
•
Compiler:
•
•
rekursive Programmierung
Haskell-Web-Seite
mit einer stark typisierten
Haskell-Doku
Manuel Chakravarty und Gabriele Keller, Einführung in die Programmierung mit Haskell
Richard Bird, Introduction to Functional Programming Using Haskell
Simon Thompson, Haskell: The Craft of Functional Programming
Graham Hutton, Programming in Haskell (2007)
funktionalen Programmiersprache
mit parametrischem Polymorphismus
Jeffrey D. Ullman, Monica S. Lam, Ravi Sethi , Alfred V. Aho Compilers:
Principles, Techniques, and Tools , 2nd Edition, Pearson 2006
deutsch: Compiler: Prinzipien, Techniken und Werkzeuge, Pearson Studium, 2008
Niklaus Wirth, Grundlagen und Techniken des Compilerbaus, Oldenbourg
1997
Grundlagen der Programmierung 2 (1.A)
- 2 -
Grundlagen der Programmierung 2 (1.A)
- 3 -
Haskell
Grundlagen der Programmierung 2 (1.A)
- 4 -
Haskell
Haskell
Haskell ist eine moderne Programmiersprache;
sehr weitgehende Konzepte werden erprobt und kombiniert
•
•
•
Wichtige Eigenschaften funktionaler Programmiersprachen
Referentielle Transparenz
Gleiche Funktion, gleiche Argumente =⇒ gleicher (Rückgabe-)Wert
Keine Seiteneffekte! D.h. keine Änderung von Objekten
Verzögerte Auswertung
Nur die für das Resultat notwendigen Unterausdrücke werden
(so spät wie möglich) ausgewertet.
Parametrisch Polymorphes Typsystem
Nur Ausdrücke mit Typ sind erlaubt — es gibt Typvariablen.
Das Typsystem garantiert: keine dynamischen Typfehler.
Automatische Speicherverwaltung
Anforderung und Freigabe von Speicher
strenge und statische Typisierung
Nicht-strikte Auswertung
⇒
⇒
viele korrekte Programmtransformationen
korrekte automatische Parallelisierung
Prozess-Programmierung und Konkurrente Auswertung
⇒
deklarative Programmierung
- 5 -
Grundlagen der Programmierung 2 (1.A)
PR zu Funktionalen Programmiersprachen
- 6 -
Grundlagen der Programmierung 2 (1.A)
Programmierung in Haskell
OCaml: Variante von ML, eine Programmiersprache analog zu Haskell.
Grundprinzipien: des funktionalen Programmierens
Aus dem Artikel von Yaron Minsky und Stephen Weeks: (JFP 2008)
Immutability wird gelobt:
entspricht Verzicht auf Zuweisungen
Pattern Matching wird gelobt:
entspricht Datentypen mit Konstruktoren und case-Expressions
Tail-Rekursions-Optimierung) wird vermisst.
( kommt noch)
Grundlagen der Programmierung 2 (1.A)
Das gibt es in Haskell
- 7 -
•
•
•
•
Definition von Funktionen
Aufbau von Ausdrücken:
Anwendung der Funktion auf Argumente,
die wieder Ausdrücke sein können.
programminterne Kommunikation:
Nur der Wert von Ausdrücken wird bei der
Auswertung zurückgegeben.
Funktionen können Datenobjekte sein
Grundlagen der Programmierung 2 (1.A)
quadrat x = x*x
3*(quadrat 5)
75
- 8 -
Standards zu Folien und Skript
Interpreter / Compiler für Haskell
Wir verwenden den Interpreter GHCi
Darstellung von Quell-Code (Source-code) auf den Folien und Skript:
www.haskell.org
quadrat x = x*x
Einfacher Download und Installation
Darstellung von Interpreteraktionen auf Folien und Skript:
Siehe Hilfestellungen auf der Professur-Webseite.
*Main> 2+2 ←4
Simon Peyton Jones und Simon Marlow ( Microsoft Research)
die wichtigsten Forscher und Weiterentwickler des
GHC: (Glasgow Haskell Compiler).
(März 2013: Simon Marlow wechselt zu Facebook.)
Grundlagen der Programmierung 2 (1.A)
- 9 -
Umgang mit dem Interpreter
Online-Report
Aufruf:
- 10 -
Grundlagen der Programmierung 2 (1.A)
Einfache Daten und Operatoren
http://www.haskell.org/onlinereport
ghci (im richtigen Fenster)
prompt > ghci ←< Einige Zeilen Infos >
Prelude> :h ←< Hilfe-Menu >
Prelude> :t True ←True :: Bool
(druckt den Typ des Ausdrucks True)
(Option s für Statistik gesetzt)
Prelude> :set +s ←-
•
ganze Zahlen
•
•
•
•
•
beliebig lange ganze Zahlen
rationale Zahlen
Gleitkommazahlen
Zeichen
Datenkonstruktoren
0,1,-3
Typ: Int
n mit |n| ≤ 231 − 1 = 2147483647
11122399387141 Typ: Integer,
3%7
Typ: Ratio
3.456e+10
Typ: Floating
’a’
Typ: Char
True, False
Typ: Bool
Diese nennen wir auch Basiswerte (bis auf Floating)
Module im Interpreter verwenden:
Prelude> :m +Char +Numeric ←Grundlagen der Programmierung 2 (1.A)
- 11 -
Grundlagen der Programmierung 2 (1.A)
- 12 -
Einfache Daten und Operatoren
Beispiel
Definition eines Polynoms, z.B.: x2 + y 2:
•
•
•
Arithmetische Operatoren:
(ein) Typ: Int → Int → Int
+, −, ∗, /,
Arithmetische Vergleiche:
(ein) Typ: Int → Int → Bool
==, <=, < . . .
Logische Operatoren:
(ein) Typ: Bool → Bool → Bool
&&, ||, not
quadratsumme x y = quadrat x + quadrat y
Auswertung:
... *Main> quadratsumme 3 4 ←25
- 13 -
Grundlagen der Programmierung 2 (1.A)
Typen in Haskell
Grundlagen der Programmierung 2 (1.A)
- 14 -
Typen in Haskell
Ausdruck
TYP
Integer ->
Integer ->
Integer ->
Integer ->
Integer ->
Int
Integer
Float
Double
Integer
Integer
Integer
Typ
(Typ von Argument 1) -> (Typ von Argument 2) -> Ergebnistyp
3
123
1.23e45
1.23e45
(+)
quadrat
quadratsumme
Konstanten,
Funktionen
Beispiel
Die Ausgabe des Interpreters für die Addition (+) ist komplizierter:
Prelude> :t (+) ←(+) :: (Num a) => a -> a -> a
D.h.: Für alle Typen a, die man als numerisch klassifiziert hat,
d.h. die in der Typklasse Num sind,
hat (+) den Typ a -> a -> a
Z.B. gilt:
(+)::Integer -> Integer -> Integer
(+)::Double -> Double -> Double
Grundlagen der Programmierung 2 (1.A)
- 15 -
Grundlagen der Programmierung 2 (1.A)
- 16 -
(vereinfachte) Haskell-Syntax
Aus der Haskell-Dokumentation
hFunktionsDefinitioni ::= hFunktionsnameihParameteri∗ = hAusdrucki
hAusdrucki
::= hBezeichneri | hZahli
| (hAusdrucki hAusdrucki)
| (hAusdrucki)
| (hAusdruckihBinInfixOpi hAusdrucki)
hBezeichneri
::= hFunktionsnamei | hDatenkonstruktornamei
| hParameteri | hBinInfixOpi
hBinInfixOpi
::= ∗ | + | − | /
Argumente einer Funktion:
Anzahl der Argumente:
formale Parameter.
Stelligkeit der Funktion: (ar(f ))
Die Nichtterminale
hFunktionsnamei, hParameteri, hBezeichneri, hDatenkonstruktornamei
sind Namen (z.b. quadrat“)
”
- 17 -
Grundlagen der Programmierung 2 (1.A)
(lambda abstraction, n>=1)
(let expression)
(conditional)
(case expression)
(do expression)
function application)
(variable)
(general constructor)
(parenthesized expression)
(tuple, k>=2)
(list, k>=1)
(arithmetic sequence)
Grundlagen der Programmierung 2 (1.A)
- 18 -
Ein Haskell-Programm ist definiert als
quadratsumme x y = (quadrat x) + (quadrat y)
Grundlagen der Programmierung 2 (1.A)
exp10 -> \ apat1 ... apatn -> exp
| let decls in exp
| if exp then exp else exp
| case exp of { alts }
| do { stmts }
|
fexp
fexp -> [fexp] aexp
aexp -> qvar
| gcon
| literal
| ( exp )
| ( exp1 , ... , expk )
| [ exp1 , ... , expk ]
| [ exp1 [, exp2] .. [exp3] ]
Programm
Beispiel zur Grammatik
Zeichenfolge
im Programm
quadratsumme
x
y
=
(quadrat x) + (quadrat y)
+
quadrat x
http://www.hck.sk/users/peter/HaskellEx.htm
http://www.haskell.org/onlinereport/exps.html#sect3.2
Name in der Grammatik (sog. Nichtterminal)
hFunktionsnamei
hParameteri
hParameteri
=
gleiches Zeichen wie in Grammatik
hAusdrucki der Form hAusdrucki + hAusdrucki
binärer Infix-Operator
Anwendung: quadrat ist ein Ausdruck
und x ist ein Ausdruck
- 19 -
• Eine Menge von Funktionsdefinitionen
• Eine davon ist die Definition der Konstanten main.
Ohne main: dann ist es ein Modul
Grundlagen der Programmierung 2 (1.A)
- 20 -
Fallunterscheidung: IF-THEN-ELSE
Haskell: Verschiedenes . . .
Prelude: vordefinierte Funktionen, Typen und Datenkonstruktoren
Syntax: if hAusdrucki then hAusdrucki else hAusdrucki
Präfix, Infix, Prioritäten: ist möglich für Operatoren
if“, then“, else“ sind reservierte Schlüsselworte
”
”
”
Konventionen zur Klammerung: s1 s2 . . . sn ≡ ((. . . (s1 s2) s3 . . .) sn)
Der erste Ausdruck ist eine Bedingung (Typ Bool)
Funktionsdefinitionen:
• formale Parameter müssen verschiedenen sein;
• keine undefinierten Variablen im Rumpf!
Typisierung: if Bool . . . then typ else typ
Weitere Trennzeichen: “{“,“}“ Semikolon “; “
(if 1 then 1 else 2)
Layout-sensibel: bewirkt Klammerung mit {, }.
ergibt einen (Typ-)Fehler
- 21 -
Grundlagen der Programmierung 2 (1.A)
Bedingungen, Arithmetische Vergleiche
- 22 -
Darstellungen eines Programms
Die Infixoperatoren ==, <, >, <=, >=, / = haben den Typ:
Integer -> Integer -> Bool
sichtbare Syntax: vom Programmierer benutzt
Achtung: = ist reserviert für Funktionsdefinitionen und let
Boolesche Ausdrücke
sind kombinierbar mit
not, ||, &&
Konstanten sind True, False.
Grundlagen der Programmierung 2 (1.A)
Interne Syntax: “Linearisierung“; entzuckerte Version;
voll geklammert; alle Operatoren sind Präfix; kein Layout
(nicht, oder, und)
Ableitungsbaum (Herleitungsbaum): Interne Darstellung;
Vom Kompiler erzeugt
Beispiel: 3.0 <= x && x < 5.0
Grundlagen der Programmierung 2 (1.A)
- 23 -
Grundlagen der Programmierung 2 (1.A)
- 24 -
Darstellungen eines Programms
Syntaxbaum: Beispiele
if x <= 0 then 1 else x*(quadrat (x-1))
Syntaxbaum:
Eindeutige Darstellung des Programms als markierter Baum.
Wird vom Compiler/Interpreter (Parser) intern erzeugt.
Ermöglicht die eindeutige Definition
der Ausführung des Programms.
ifThenElseUUUUU
<=
DD
{
x
{
{{
{{
{{
{} {
i
iiii
iiii
iiii
tiiii
DD
DD
DD
DD
!
0
1
UUUU
UUUU
UUUU
U*
x
∗ KKKK
KK
KK
KK
KK
KK
%
quadrat
x
Entspricht der hierarchischen Schachtelung des Programms.
Z.B. Klammerstruktur.
x*(quadrat (x-1))
q
qqq
qqq
qqq
qx qq
x





− MMMM
MMM
MMM
MMM
&
1
∗ MMMMM
MMM
MMM
MMM
&
quadrat
x
- 25 -
Grundlagen der Programmierung 2 (1.A)
Syntaxbaum: Beispiele
Zwei Syntaxbäume zu
1





− @@
@@
@@
@@
2
}}
}}
}}
}
~}
~~
~~
~~
~~
~
1





1-2-3:
(1 − (2 − 3))
− ??
??
??
??
3
− ??
??
??
??
− AA
AA
AA
AA
3
((1 − 2) − 3)
2
Nur einer ist ist gültig in Haskell.
Grundlagen der Programmierung 2 (1.A)
- 27 -
Grundlagen der Programmierung 2 (1.A)
qqq
qqq
qqq
q
q
qx q
− MMMM
MMM
MMM
MMM
&
1
- 26 -
Herunterladen