Programmieren in Haskell - WS 2011/2012

Werbung
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Programmieren in Haskell
WS 2011/2012
Administratives
Haskell
Syntax
Notation
Typsystem
Robert Giegerich
Universität Bielefeld
AG Praktische Informatik
October 17, 2012
Auswertung
Sprechstunden
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
GZI-Arbeitsraum (V2-240)
Tutoren-Sprechstunden (V2-228)
http://www.techfak.uni-bielefeld.de/ags/pi/
lehre/AuDIWS12/#ueb
http://www.techfak.uni-bielefeld.de/ags/rbg/
de/gzi-tutoren.html
Haskell
Syntax
Notation
Typsystem
Auswertung
Haskell
Universität Bielefeld
Programmieren
in Haskell
seit 1990
benannt nach dem Logiker Haskell Curry, aufbauend auf
den Sprachen von ML und Miranda
funktional (pure) – d.h. keine “Behälter”, keine
Anweisungen, kein vorher-nachher
lazy evaluation (alias verzögerte Auswertung)
polymorph und stark typisiert
Typinferenz
Layout-sensitiv
Die wichtigsten Implementierungen: Hugs (Interpreter),
GHC (Compiler)
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Bürger erster Klasse
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Funktionen gibt es in allen Programmiersprachen.
In einer funktionalen Sprache sind Funktionen “first class
citizens”: Funktionen sind den Daten gleichberechtigt. Sie
können
Haskell
Syntax
Notation
Argumente von (anderen) Funktionen sein
Typsystem
Ergebnisse von (anderen) Funktionen sein
Auswertung
anonym oder benannt sein
über beliebigen Datentypen definiert werden
1
Administratives
Funktionen “höherer Ordnung” ersetzen Kontrollstruktur
map :: ( a -> b ) -> [ a ] - >[ b ]
Haskell Syntax
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Es folgt eine kurze Zusammenfassung der Haskell Syntax.
Vieles davon wird erst später gebraucht.
Notation
Typsystem
Auswertung
Schlüsselwörter
1
2
3
case class data default deriving do else
if import in infix infixl infixr instance
let module newtype of then type where _
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Schlüsselwörter
1
2
3
Universität Bielefeld
case class data default deriving do else
if import in infix infixl infixr instance
let module newtype of then type where _
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Vergleich
Syntax
Notation
Sprache
#Keywords
Haskell
Scheme
C (C89)
Java
Ada
C++
21
23
32
50
72
74
Typsystem
Auswertung
Groß- und Kleinschreibung
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Modulname
erster Buchstabe großgeschrieben
Modulname == Dateiname
Administratives
Haskell
Syntax
Datentypnamen: Großgeschrieben
Datentyp-Konstrukturen: Großgeschrieben
(z.B. Datentype Bool → Konstruktoren: True und False
Funktionsnamen: Kleingeschrieben
Operatorzeichen → Infix
Sonstige Funktionsnamen: Prefix
Prioritäten und Assoziation definierbar
Notation
Typsystem
Auswertung
Keine (!) Anweisungen
Universität Bielefeld
Programmieren
in Haskell
keine Statements in Haskell
keine Wertzuweisung, kein FOR, kein WHILE ...
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Keine (!) Anweisungen
Universität Bielefeld
Programmieren
in Haskell
keine Statements in Haskell
keine Wertzuweisung, kein FOR, kein WHILE ...
→ da funktionale Programmiersprache
Giegerich
Administratives
Haskell
Syntax
Es wird beschrieben, WAS berechnet werden soll, aber nicht
WIE. So wie in
(1 + f (2)) ∗ 32 ∗ (4 + g(5)).
Notation
Typsystem
Auswertung
Keine (!) Anweisungen
Universität Bielefeld
Programmieren
in Haskell
keine Statements in Haskell
keine Wertzuweisung, kein FOR, kein WHILE ...
→ da funktionale Programmiersprache
Giegerich
Administratives
Haskell
Syntax
Es wird beschrieben, WAS berechnet werden soll, aber nicht
WIE. So wie in
(1 + f (2)) ∗ 32 ∗ (4 + g(5)).
1
2
3
Ein Haskell-Programm besteht im wesentlichen aus einer
Menge von Definitionen a la
f x y z = ... ein Ausdruck der x ,y , z benutzt
g []
= 0
-- hier mit
g ( x : xs ) = 1 + g xs
-- pattern matching
Notation
Typsystem
Auswertung
Präfix, Infix, Postfix-Notation
Universität Bielefeld
Programmieren
in Haskell
Viele Schreibweisen für Ausdrücke:
Giegerich
Administratives
Haskell
Notation
Präfix
Infix
Postfix
Mixfix
mathematisch
−1, f (x , y , z)
x < y , n2 , 2x + 5
n!, f 0
---
Grafix
q
3
1−
Rb
a
√
y
f (x ) dx
in Haskell
-1, f x y z
x<y, nˆ2, 2*x+5
--if a then b else c
anstatt IfThenElse a b c
root 3 (1 - (root 2 y))
integral a b f
Syntax
Notation
Typsystem
Auswertung
Operatoren
Boolsche Operatoren vordefiniert:
|| oder
&& und
‘not‘
Vergleichsoperatoren:
<
<=
==
/=
...
reguläre Funktionen in Haskell
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Operatoren
Boolsche Operatoren vordefiniert:
|| oder
&& und
‘not‘
Vergleichsoperatoren:
<
<=
==
/=
...
reguläre Funktionen in Haskell
Example
Hugs> :t (&&)
(&&) :: Bool -> Bool -> Bool
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Beispiel
Universität Bielefeld
Programmieren
in Haskell
1
2
> inbetween a b c =
>
if a <= b && b <= c then True else False
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Beispiel
Universität Bielefeld
Programmieren
in Haskell
1
2
> inbetween a b c =
>
if a <= b && b <= c then True else False
Eleganter
Giegerich
Administratives
Haskell
Syntax
1
> inbetween a b c = a <= b && b <= c
Notation
Typsystem
Geht’s noch eleganter?
1
inbetween a b c = a <= b <= c
Auswertung
Beispiel
Universität Bielefeld
Programmieren
in Haskell
1
2
> inbetween a b c =
>
if a <= b && b <= c then True else False
Eleganter
Giegerich
Administratives
Haskell
Syntax
1
> inbetween a b c = a <= b && b <= c
Notation
Typsystem
Geht’s noch eleganter?
1
1
2
3
4
Auswertung
inbetween a b c = a <= b <= c
allequal . lhs :7:20:
Precedence parsing error
cannot mix ‘ <= ’ [ infix 4] and
‘ <= ’ [ infix 4] in the same infix expression
Prefix/Infix-Konversion
Funktionen als Operatoren
Operatoren als Funktionen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Prefix/Infix-Konversion
Funktionen als Operatoren
Operatoren als Funktionen
‘fn‘ konvertiert nach Infix
(op) konvertiert nach Prefix
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Prefix/Infix-Konversion
Funktionen als Operatoren
Operatoren als Funktionen
‘fn‘ konvertiert nach Infix
(op) konvertiert nach Prefix
Example
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Main>
23
Main>
23
Test>
23
Test>
23
21 + 2
(+) 21 2
div 69 3
69 ‘div‘ 3
Auswertung
Prefix/Infix: Prioritäten
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Flexible Anwendung von Funktionen
Administratives
Deklaration von Prioritäten möglich
Haskell
Syntax
meist geeignet vordefiniert
Notation
Funktionsanwendung in Präfix hat höchste Priorität
1
> f x + g y * 2
ist
( f x ) + (( g y ) *2)
Typsystem
Auswertung
2
3
Achtung bei Definitionen :
4
5
> f ( x : xs ) ys = x : f xs ys
braucht Klammern !!
Bedingter Ausdruck
Universität Bielefeld
Programmieren
in Haskell
1
if expr1 then expr2 else expr3
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Bedingter Ausdruck
Universität Bielefeld
Programmieren
in Haskell
1
if expr1 then expr2 else expr3
Giegerich
Kein If-Statement!
Administratives
if expr1 then expr2 ?
Haskell
Syntax
Notation
Typsystem
Auswertung
Bedingter Ausdruck
Universität Bielefeld
Programmieren
in Haskell
1
if expr1 then expr2 else expr3
Giegerich
Kein If-Statement!
Administratives
if expr1 then expr2 ?
Fehler!
Haskell
Syntax
Notation
→ hier wäre der Wert des Ausdrucks im else-Fall nicht
definiert
Typsystem
Auswertung
Bedingter Ausdruck
Universität Bielefeld
Programmieren
in Haskell
1
if expr1 then expr2 else expr3
Giegerich
Kein If-Statement!
Administratives
if expr1 then expr2 ?
Fehler!
Haskell
Syntax
Notation
→ hier wäre der Wert des Ausdrucks im else-Fall nicht
definiert
Vergleichbar mit dem Bedingungsoperator in C/Java:
cond_expr ? expr2 : expr3
Typsystem
Auswertung
Bedingter Ausdruck
Universität Bielefeld
Programmieren
in Haskell
1
if expr1 then expr2 else expr3
Giegerich
Kein If-Statement!
Administratives
if expr1 then expr2 ?
Fehler!
Haskell
Syntax
Notation
→ hier wäre der Wert des Ausdrucks im else-Fall nicht
definiert
Vergleichbar mit dem Bedingungsoperator in C/Java:
cond_expr ? expr2 : expr3
Example
1
func a b
= if a <= b then a else b
Typsystem
Auswertung
Case-Ausdruck
Universität Bielefeld
Programmieren
in Haskell
vielfache Fallunterscheidung
statt verschachtelte If-Expressions
Giegerich
Administratives
überall wo ein Ausdruck stehen kann
Haskell
Pattern matching
Syntax
Notation
Typsystem
Auswertung
Case-Ausdruck
Universität Bielefeld
Programmieren
in Haskell
vielfache Fallunterscheidung
statt verschachtelte If-Expressions
Giegerich
Administratives
überall wo ein Ausdruck stehen kann
Haskell
Pattern matching
Syntax
Notation
1
2
3
4
5
case expr of
pat1 | guard1 -> expr1
pat2 | guard2 -> expr2
pat3 | guard3 -> expr3
...
Typsystem
Auswertung
Case-Ausdruck
Universität Bielefeld
Programmieren
in Haskell
vielfache Fallunterscheidung
statt verschachtelte If-Expressions
Giegerich
Administratives
überall wo ein Ausdruck stehen kann
Haskell
Pattern matching
Syntax
Notation
1
2
3
4
5
case expr of
pat1 | guard1 -> expr1
pat2 | guard2 -> expr2
pat3 | guard3 -> expr3
...
Pattern kann leer sein
statt pat | True -> gilt auch die Konvention pat ->
otherwise als default
Typsystem
Auswertung
Case-Ausdruck
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Example
Haskell
Syntax
1
2
3
4
5
> laststr xs = case reverse xs of
>
[]
-> " leer "
>
( l : ls ) | l == 1 -> " eins "
>
( l : ls ) | l == 2 -> " zwei "
>
otherwise
-> " ganz viele "
Notation
Typsystem
Auswertung
Sichtbarkeitsbereiche
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Alle (modernen) Programiersprachen haben
Sichtbarkeitsbereiche (scopes).
Jeder Name ist in dem Bereich sichtbar
Administratives
Haskell
Syntax
Notation
in dem er definiert wurde
Typsystem
und in allen darin eingebetteteten Bereichen
Auswertung
Scopes in einem Programm sind also “verschachtelt”.
Explizite Regeln gelten für Sichtbarkeit über Modulgrenzen
hinweg.
Let Expression
1
2
3
4
let decl1
decl2
...
in expr
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Let Expression
1
2
3
4
let decl1
decl2
...
in expr
Universität Bielefeld
Kann überall dort stehen wo ein
Ausdruck stehen kann
lokaler Scope (Sichtbarkeitsbereich)
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Let Expression
let decl1
decl2
...
in expr
1
2
3
4
Universität Bielefeld
Kann überall dort stehen wo ein
Ausdruck stehen kann
lokaler Scope (Sichtbarkeitsbereich)
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Example
Notation
1
2
3
> func a b
>
>
= let square x = x * x
plus a b = a + b
in plus ( square a ) ( square b )
Typsystem
Auswertung
Let Expression
let decl1
decl2
...
in expr
1
2
3
4
Universität Bielefeld
Kann überall dort stehen wo ein
Ausdruck stehen kann
lokaler Scope (Sichtbarkeitsbereich)
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Example
Notation
3
> func a b
>
>
= let square x = x * x
plus a b = a + b
in plus ( square a ) ( square b )
1
Versus:
> square x
= x * x
> plus a b
= a + b
> func a b
= plus ( square a ) ( square b )
1
2
2
3
4
5
Typsystem
Auswertung
Where-Notation
lokale Definitionen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Where-Notation
lokale Definitionen
bei Funktionsdefinitionen
case-Ausdrücken
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Where-Notation
lokale Definitionen
bei Funktionsdefinitionen
case-Ausdrücken
Module-Definition . . .
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Where-Notation
lokale Definitionen
bei Funktionsdefinitionen
case-Ausdrücken
Module-Definition . . .
Example
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
1
2
3
> f x = square x + square x
>
where
>
square x = x * x
Typsystem
Auswertung
Where-Notation
lokale Definitionen
bei Funktionsdefinitionen
case-Ausdrücken
Module-Definition . . .
Example
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
1
2
3
> f x = square x + square x
>
where
>
square x = x * x
vs. let Ausdruck
notationelle Betonung
syntaktischer Zucker
where kann nicht überall stehen
Typsystem
Auswertung
Where-Notation
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
1
2
3
4
5
Schachtelungen auch möglich:
> foo x = ... f ...
>
where
>
f x = ... g ...
>
where
>
g x = ....
Haskell
Syntax
Notation
Typsystem
Auswertung
Layout und Abseitsregel
Universität Bielefeld
Programmieren
in Haskell
Haskell-Programme sind whitespace-sensitive
→ Verzicht auf Trennzeichen wie ; {}
es gilt die Offside-Rule (Abseitsregel)
→ die Einrückung ist entscheidend
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Layout und Abseitsregel
Universität Bielefeld
Programmieren
in Haskell
Haskell-Programme sind whitespace-sensitive
→ Verzicht auf Trennzeichen wie ; {}
es gilt die Offside-Rule (Abseitsregel)
→ die Einrückung ist entscheidend
explizite Verwendung von ; {} ist möglich
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Layout und Abseitsregel
Universität Bielefeld
Programmieren
in Haskell
Haskell-Programme sind whitespace-sensitive
→ Verzicht auf Trennzeichen wie ; {}
es gilt die Offside-Rule (Abseitsregel)
→ die Einrückung ist entscheidend
explizite Verwendung von ; {} ist möglich
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Example (Fehler)
1
2
3
4
5
> laststr xs = case reverse xs of
>
[]
-> " leer "
>
( l : ls ) | l == 1 -> " eins "
>
( l : ls ) | l == 2 -> " zwei "
>
otherwise
-> " ganz viele "
Layout
Definitionen gleicher Stufe stehen in der gleichen Einrücktiefe.
Example (korrigiert)
1
2
3
4
5
> laststr xs = case reverse xs of {
>
[]
-> " leer " ;
>
( l : ls ) | l == 1 -> " eins " ;
>
( l : ls ) | l == 2 -> " zwei " ;
>
otherwise
-> " ganz viele " }
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Layout
Universität Bielefeld
Definitionen gleicher Stufe stehen in der gleichen Einrücktiefe.
Giegerich
Example (korrigiert)
1
2
3
4
5
> laststr xs = case reverse xs of {
>
[]
-> " leer " ;
>
( l : ls ) | l == 1 -> " eins " ;
>
( l : ls ) | l == 2 -> " zwei " ;
>
otherwise
-> " ganz viele " }
Example
1
2
3
4
5
> f x = g x +
>
where { g
> f x = g x +
>
where g x
h x
Programmieren
in Haskell
h
x
h
=
=
x
= x * x ; h x = x + x }
x
x * x
x + x
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Allgemeine Abseitsregel
Universität Bielefeld
Programmieren
in Haskell
Giegerich
alle Definitionen eines Scope stehen in der gleichen
Einrücktiefe
Administratives
Haskell
tieferes Einrücken bedeutet Fortsetzung der aktuellen
Definitionszeile
Syntax
nach let, where, of, do bestimmt der nächste
Buchstabe die neue Einrücktiefe
Typsystem
Ausrücken nach links beendet den aktuellen Scope
Notation
Auswertung
Allgemeine Abseitsregel
Universität Bielefeld
Programmieren
in Haskell
Giegerich
alle Definitionen eines Scope stehen in der gleichen
Einrücktiefe
Administratives
Haskell
tieferes Einrücken bedeutet Fortsetzung der aktuellen
Definitionszeile
Syntax
nach let, where, of, do bestimmt der nächste
Buchstabe die neue Einrücktiefe
Typsystem
Ausrücken nach links beendet den aktuellen Scope
Vorteile ??
Nachteile ??
Notation
Auswertung
Fehlerbehandlung
Universität Bielefeld
Programmieren
in Haskell
Giegerich
mehrere Möglichkeiten Fehler zu behandeln in Haskell
Programmen (mindestens 8)
Administratives
Haskell
einfachster Mechanismus: error
Syntax
Signature: error :: String -> a
Notation
weitere Mechanismen in folgenden Vorlesungen
Typsystem
Auswertung
Fehlerbehandlung
Universität Bielefeld
Programmieren
in Haskell
Giegerich
mehrere Möglichkeiten Fehler zu behandeln in Haskell
Programmen (mindestens 8)
Administratives
Haskell
einfachster Mechanismus: error
Syntax
Signature: error :: String -> a
Notation
weitere Mechanismen in folgenden Vorlesungen
Typsystem
Auswertung
Example
1
2
3
> divide a b =
>
if b == 0 then error " divide by zero "
>
else div a b
Modul-Aufbau
Modulname
Imports
Definitionen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Modul-Aufbau
Modulname
Imports
Definitionen
1
2
> module Meinmodul
> where
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
3
4
> import Data . List
Typsystem
Auswertung
5
6
> splits n = [ splitAt k [1.. n ] | k < -[1.. n -1]]
Modul-Aufbau
Universität Bielefeld
Programmieren
in Haskell
Modulname
Imports
Definitionen
1
2
Giegerich
Administratives
Haskell
> module Meinmodul
> where
Syntax
Notation
3
4
Typsystem
> import Data . List
Auswertung
5
6
> splits n = [ splitAt k [1.. n ] | k < -[1.. n -1]]
Main> splits
[ ( [1
( [1,2
( [1,2,3
( [1,2,3,4
5
],[
],[
],[
],[
2,3,4,5]
3,4,5]
4,5]
5]
)
)
)
)
,
,
,
]
Wächter (Guards) in Funktionsdefinitionen
1
2
3
4
> fn pat1 pat2 ...
>
| guard1 = expr1
>
| guard2 = expr2
>
...
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Wächter (Guards) in Funktionsdefinitionen
1
2
3
4
> fn pat1 pat2 ...
>
| guard1 = expr1
>
| guard2 = expr2
>
...
syntaktische Zucker für Funktionsdefinitionen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
ersetzt geschachtelte if-Anweisungen
Typsystem
guards (Wächter) sind Ausdrücke (vom Typ Bool)
Auswertung
Wächter (Guards) in Funktionsdefinitionen
1
2
3
4
> fn pat1 pat2 ...
>
| guard1 = expr1
>
| guard2 = expr2
>
...
syntaktische Zucker für Funktionsdefinitionen
2
3
4
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
ersetzt geschachtelte if-Anweisungen
Typsystem
guards (Wächter) sind Ausdrücke (vom Typ Bool)
Auswertung
Example
1
Universität Bielefeld
howManyEqual n m p
| ( n == m ) && ( m == p )
= 3
| ( n == m ) || ( m == p ) || ( n == p ) = 2
| otherwise
= 0
Pattern matching
Universität Bielefeld
Programmieren
in Haskell
Pattern Matching auf
natürlichen Zahlen
Werten
Datentyp-Konstruktoren
Joker
Giegerich
Administratives
Haskell
Syntax
Notation
auf der linken Seite von Funktionsdefinitionen
Typsystem
in case-Ausdrücken
Auswertung
Pattern matching
Universität Bielefeld
Programmieren
in Haskell
Pattern Matching auf
natürlichen Zahlen
Werten
Datentyp-Konstruktoren
Joker
2
3
Administratives
Haskell
Syntax
Notation
auf der linken Seite von Funktionsdefinitionen
Typsystem
in case-Ausdrücken
Auswertung
Example
1
Giegerich
> take ’
:: Int -> [ a ] -> [ a ]
> take ’ ( n +1) ( a : as ) = a : take ’ n as
> take ’ _
_
= []
Pattern matching
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Example
1
2
3
4
>
>
>
>
f
f
f
f
( a : b : c : d : ds )
( a : as )
( a :[])
[a]
Administratives
=
=
=
=
...
...
...
...
5
6
7
8
> g 0
> g 1
> g _
= ...
= ...
= ...
Haskell
Syntax
Notation
Typsystem
Auswertung
Datentypen
Ein Datentyp ist eine Mengen von Werten, worauf Operationen
(Funktionen) definiert werden können.
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Datentypen
Ein Datentyp ist eine Mengen von Werten, worauf Operationen
(Funktionen) definiert werden können.
“Eingebaute” Datentypen in Haskell sind zum Beispiel:
Ganze Zahlen (Integer, Int)
Funktionen darauf sind z.B.: +, div, square
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Fließkommazahlen (Float, Double)
+, /, square
Wahrheitswerte (Bool): True, False
&&, ||
Listen ([a])
++, reverse, take
Zeichen (Char)
Zeichenketten (String), wobei String = [Char]
Typsystem
Auswertung
Datentypen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
1
2
3
4
5
6
Ausdrücke haben Typen:
42
::
3 + 4
::
4.2
::
True
::
" Hallo Welt ! " ::
[1 ,2 ,3]
::
Haskell
Int
Int
Float
Bool
String -- bzw . [ Char ]
[ Int ]
Syntax
Notation
Typsystem
Auswertung
Datentypen
In der Haskell Shell (z.B. Hugs) Typ-Inferenz von Ausdrücken:
Hugs> :t (1+2)
1 + 2 :: Num a => a
Hugs> :t (4.2)
4.2 :: Fractional a => a
Hugs> :t 2/3
2 / 3 :: Fractional a => a
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Datentypen
Universität Bielefeld
In der Haskell Shell (z.B. Hugs) Typ-Inferenz von Ausdrücken:
Hugs> :t (1+2)
1 + 2 :: Num a => a
Hugs> :t (4.2)
4.2 :: Fractional a => a
Hugs> :t 2/3
2 / 3 :: Fractional a => a
Typen Einschränken:
Hugs> (2::Int)
ERROR - Cannot
*** Instance
*** Expression
/ (3::Int)
infer instance
: Fractional Int
: 2 / 3
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Datentypen
Universität Bielefeld
In der Haskell Shell (z.B. Hugs) Typ-Inferenz von Ausdrücken:
Hugs> :t (1+2)
1 + 2 :: Num a => a
Hugs> :t (4.2)
4.2 :: Fractional a => a
Hugs> :t 2/3
2 / 3 :: Fractional a => a
Typen Einschränken:
Hugs> (2::Int)
ERROR - Cannot
*** Instance
*** Expression
/ (3::Int)
infer instance
: Fractional Int
: 2 / 3
Hugs> (2::Int) ‘div‘ (3::Int)
0
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Typklassen
In Haskell sind Typen in Klassen organisiert. Typen sind dabei
Instanzen von Klassen.
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Typklassen
In Haskell sind Typen in Klassen organisiert. Typen sind dabei
Instanzen von Klassen.
Beispiele für Typklassen
Eq Überprüfung auf Gleichheit. In der Klasse Eq sind die
Operationen == und /= definiert.
Instanzen z.B.: Int, Float, Double, String
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Typklassen
In Haskell sind Typen in Klassen organisiert. Typen sind dabei
Instanzen von Klassen.
Beispiele für Typklassen
Eq Überprüfung auf Gleichheit. In der Klasse Eq sind die
Operationen == und /= definiert.
Instanzen z.B.: Int, Float, Double, String
Ord Ordnungsrelation. In der Klasse Ord sind die Operationen
<,>,<=,>= definiert.
Instanzen z.B.: Int, Float, Double, String
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Typklassen
In Haskell sind Typen in Klassen organisiert. Typen sind dabei
Instanzen von Klassen.
Beispiele für Typklassen
Eq Überprüfung auf Gleichheit. In der Klasse Eq sind die
Operationen == und /= definiert.
Instanzen z.B.: Int, Float, Double, String
Ord Ordnungsrelation. In der Klasse Ord sind die Operationen
<,>,<=,>= definiert.
Instanzen z.B.: Int, Float, Double, String
Num Umfasst die numerischen Typen, z.B. Int, Float, Double
Operationen: +,-,*
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Typklassen
In Haskell sind Typen in Klassen organisiert. Typen sind dabei
Instanzen von Klassen.
Beispiele für Typklassen
Eq Überprüfung auf Gleichheit. In der Klasse Eq sind die
Operationen == und /= definiert.
Instanzen z.B.: Int, Float, Double, String
Ord Ordnungsrelation. In der Klasse Ord sind die Operationen
<,>,<=,>= definiert.
Instanzen z.B.: Int, Float, Double, String
Num Umfasst die numerischen Typen, z.B. Int, Float, Double
Operationen: +,-,*
Show Werte eines Typs der Instanz der Klasse Show ist, lassen
sich ausgeben
Z.B. Int, Float, Double, String
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Listen
Universität Bielefeld
Notation:
[1,2,3,4]
1:2:3:4:[]
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Listen
Universität Bielefeld
Notation:
[1,2,3,4]
1:2:3:4:[]
Konstruktoren: : (cons)
[] (nil)
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Listen
Universität Bielefeld
Notation:
[1,2,3,4]
1:2:3:4:[]
Konstruktoren: : (cons)
[] (nil)
[1..10]
Signature: [a], [Int] usw.
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Listen
Universität Bielefeld
Notation:
[1,2,3,4]
1:2:3:4:[]
Konstruktoren: : (cons)
[] (nil)
[1..10]
Signature: [a], [Int] usw.
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Main> 1:2:3:4:[]
[1,2,3,4]
Listen
Universität Bielefeld
Notation:
[1,2,3,4]
1:2:3:4:[]
Konstruktoren: : (cons)
[] (nil)
[1..10]
Signature: [a], [Int] usw.
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Main> 1:2:3:4:[]
[1,2,3,4]
Example
1
2
3
> length ’
:: [ a ] -> Int
> length ’ []
= 0
> length ’ ( a : as ) = 1 + length ’ as
Tupel
Universität Bielefeld
Signatur: ( a1, a2, a3, ... )
vordefinierte Funktionen:
fst
snd
...
Komponenten können verschiedene Typen haben
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
vs. Liste
Auswertung
Tupel
Universität Bielefeld
Signatur: ( a1, a2, a3, ... )
vordefinierte Funktionen:
fst
snd
...
Komponenten können verschiedene Typen haben
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Notation
Typsystem
vs. Liste
Example
1
2
fst
:: (a , b ) -> a
fst (x , y ) = x
3
4
5
snd
:: (a , b ) -> a
snd (_ , y ) = y
Auswertung
Void
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Unit-Datentyp in Haskell: ()
Notation
einziges Element: ()
Typsystem
vergleichbar mit void in C/Java
Auswertung
Auswertung
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Syntax
Auswertung von Haskell Programmen
⇒ Ausrechnen von einem funktionalen Programm
Notation
Typsystem
Auswertung
Ausdrücke und Werte
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
1
2
3
4
Ausdrücke repräsentieren Werte. Ausdrücke sind zum Beispiel:
42
6*7
answer
reverse [2 , 4]
Syntax
Notation
Typsystem
Auswertung
Ausdrücke
Universität Bielefeld
Programmieren
in Haskell
Giegerich
1
1
Ausdrücke können einfach sein oder komplex. Einfach:
49
Komplex:
square (3+4)
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Ausdrücke
Universität Bielefeld
Programmieren
in Haskell
Giegerich
1
1
1
2
Ausdrücke können einfach sein oder komplex. Einfach:
49
Komplex:
square (3+4)
Definition von square:
square
:: Int -> Int
square x = x * x
Die “einfachste” Form eines Ausdrucks wird Normalform
genannt.
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Reduktion von Ausdrücken
Reduktion, Auswertung, Vereinfachung sind synonyme Begriffe
und beschreiben den Prozess, einen Ausdruck in seine
einfachste Form (Normalform) zu überführen.
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Example
1
2
square
:: Int -> Int
square x = x * x
Syntax
Notation
Typsystem
Auswertung
Reduktion von Ausdrücken
Reduktion, Auswertung, Vereinfachung sind synonyme Begriffe
und beschreiben den Prozess, einen Ausdruck in seine
einfachste Form (Normalform) zu überführen.
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Example
1
2
square
:: Int -> Int
square x = x * x
Reduktion von: square (3+4)
Syntax
Notation
Typsystem
Auswertung
Reduktion von Ausdrücken
Reduktion, Auswertung, Vereinfachung sind synonyme Begriffe
und beschreiben den Prozess, einen Ausdruck in seine
einfachste Form (Normalform) zu überführen.
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Example
1
2
square
:: Int -> Int
square x = x * x
Reduktion von: square (3+4)
square (3 + 4) => square 7 (+)
=> 7 * 7
(square)
=> 49
(*)
Syntax
Notation
Typsystem
Auswertung
Reduktion von Ausdrücken
Reduktion, Auswertung, Vereinfachung sind synonyme Begriffe
und beschreiben den Prozess, einen Ausdruck in seine
einfachste Form (Normalform) zu überführen.
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Haskell
Example
1
2
square
:: Int -> Int
square x = x * x
Reduktion von: square (3+4)
square (3 + 4) => square 7 (+)
=> 7 * 7
(square)
=> 49
(*)
In Haskell: Left-to-right, outermost first (lazy evaluation)
Syntax
Notation
Typsystem
Auswertung
Reduktionsvarianten
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Haskell wertet aus: Left-to-right, outermost first
Alternativ: Left-to-right, innermost first (eager evaluation)
→ non-lazy
square
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
Reduktionsvarianten
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Haskell wertet aus: Left-to-right, outermost first
Alternativ: Left-to-right, innermost first (eager evaluation)
→ non-lazy
1
2
3
4
square
square (3 + 4) = >
=>
=>
=>
Administratives
Haskell
Syntax
Notation
Typsystem
Auswertung
(3 + 4) * (3 + 4) ( square )
7 * (3 + 4)
(+)
7 * 7
(+)
49
(*)
Reduktionsvarianten
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Example
Administratives
1
2
3
take 0 xs
= []
take n []
= []
take n ( x : xs ) = x : take (n -1) xs
Haskell
Syntax
Notation
Typsystem
non-lazy: take 2 [1..]
Auswertung
Reduktionsvarianten
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Example
Administratives
1
2
3
take 0 xs
= []
take n []
= []
take n ( x : xs ) = x : take (n -1) xs
Haskell
Syntax
Notation
Typsystem
non-lazy: take 2 [1..]
take 2 [1..] =>
=>
=>
=>
take 2 (1:[2..])
(..)
take 2 (1:2:[3..])
(..)
take 2 (1:2:3:[4..]) (..)
...
Auswertung
Herunterladen