Algorithmen und Datenstrukturen I

Werbung
Gliederung
Algorithmen und Datenstrukturen I
Einführung in Haskell (I)
Einleitung
Sprachelemente
Skripte
D. Rösner
Institut für Wissens- und Sprachverarbeitung
Fakultät für Informatik
Otto-von-Guericke Universität Magdeburg
c
Winter 2009/10, 12. Oktober 2009, 2009/10
D.Rösner
D. Rösner AuD I 2009/10 . . .
1
D. Rösner AuD I 2009/10 . . .
Einleitung
Sprachelemente
Skripte
2
Einleitung
Sprachelemente
Skripte
Programmiersprache Haskell:
Haskell
benannt nach Haskell B. Curry
einer der Pioniere des λ-Kalkül
Programmierumgebung Hugs
erste Spezifikation der Sprache Ende 80er Jahre
Haskell Users Gofer System
frei erhältlicher Interpreter
für alle gängigen Plattformen
aktuelle Version: Haskell 98
Download, Tutorials, usw.: http://www.haskell.org/
einige Bücher (Auswahl):
[Tho99],
[Bir00]
[CK02]
D. Rösner AuD I 2009/10 . . .
4
D. Rösner AuD I 2009/10 . . .
5
Einleitung
Sprachelemente
Skripte
Einleitung
Sprachelemente
Skripte
Haskell
funktionale Programme in Haskell
Elementarer Einstieg
verwende Hugs als ’Taschenrechner’
Grundrechenarten:
Definitionen von Funktionen und anderen Werten durch
Gleichungen
Addition: +
Subtraktion: Multiplikation: *
Division:
Definition assoziiert Namen (Identifikator) mit Wert eines
bestimmten Typs
Syntax:
ganzzahlig: ‘div‘
Gleitkomma: /
<name> :: <type>
<name> = <expression>
Exponentiation: ^
Beachte: es gelten die üblichen Vorrangregeln
(Präzedenzregeln)
ansonsten: Verwenden von Klammern
D. Rösner AuD I 2009/10 . . .
6
D. Rösner AuD I 2009/10 . . .
Einleitung
Sprachelemente
Skripte
Einleitung
Sprachelemente
Skripte
funktionale Programme in Haskell cont.
Haskell – Sprachelemente
lies ‘::’ als ‘hat Typ’ oder ‘ist vom Typ’
Beispiele:
Typisierung: jedes Objekt in Haskell hat einen
wohldefinierten Typ
size :: Int
size = 12 + 13
Zweck der Typisierung:
frühzeitiges Erkennen von Programmierfehlern (type
checking)
schon vor Programmausführung (statische Analyse)
square :: Int -> Int
square n = n * n
D. Rösner AuD I 2009/10 . . .
7
8
D. Rösner AuD I 2009/10 . . .
10
Einleitung
Sprachelemente
Skripte
Einleitung
Sprachelemente
Skripte
Haskell – Sprachelemente
Zur Unterscheidung zwischen Int und Integer
vordefinierte elementare Typen (auch Sorten genannt) für
Konstante (= nullstellige Funktionen):
Zur Klasse Int gehören ganze Zahlen, die sich mit einer
festen Zahl von Bytes darstellen lassen.
Bool
Int
Char
Float
Integer
Rational
Double
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.
Vorschau: durch Deklaration mit type lassen sich
benutzerdefinierte Typen einführen
D. Rösner AuD I 2009/10 . . .
11
D. Rösner AuD I 2009/10 . . .
Einleitung
Sprachelemente
Skripte
12
Einleitung
Sprachelemente
Skripte
Typisierung cont.
Typisierung cont.
Typ von Funktionen (auch Funktionalität genannt) :
Definitions- und Wertebereich durch -> getrennt
angegeben
Interpretation einer Typdeklaration wie
scale :: Picture -> Int -> Picture
erstens: scale hat zwei Argumente:
Beispiel:
double :: Int -> Int
double n = 2*n
das erste ist vom (nutzerdefinierten) Typ Picture,
das zweite vom (vordefinierten) Typ Int
bei mehreren Argumenten werden deren Typen durch ->
verbunden
zweitens: das Ergebnis der Anwendung von scale ist vom
Typ Picture
Beispiel: max mit 2 Argumenten aus Int und Wert aus
Int
max :: Int -> Int -> Int
D. Rösner AuD I 2009/10 . . .
13
D. Rösner AuD I 2009/10 . . .
14
Einleitung
Sprachelemente
Skripte
Einleitung
Sprachelemente
Skripte
vordefinierte arithmetische Operatoren
vordefinierte arithmetische Operatoren cont.
+ . . . Summe zweier Zahlen
div . . . ganzzahlige Division
* . . . Produkt zweier Zahlen
ˆ . . . Exponentiation: 2 ˆ 3 gibt 8
- ...
mod . . . Rest bei ganzzahliger Division (modulo)
abs . . . Absolutbetrag
Differenz, wenn infix verwendet;
umgekehrtes Vorzeichen bei Präfixverwendung (vgl.
negate)
D. Rösner AuD I 2009/10 . . .
negate . . . ändere Vorzeichen
15
D. Rösner AuD I 2009/10 . . .
Einleitung
Sprachelemente
Skripte
Einleitung
Sprachelemente
Skripte
vordefinierte Vergleichsoperatoren
einige vordefinierte Operatoren bzw. Konstanten für
Float
für ganze Zahlen, d.h. Typ Int -> Int -> Bool:
>, >=, ==, / =, <=, <
Name(n)
+ - * /
ˆ
**
exp
log
logBase
pi
signum
sqrt
cos, sin, tan
acos, asin, atan
ceiling, floor, round
fromInt
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 I 2009/10 . . .
16
17
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 I 2009/10 . . .
Bem.
xn
xy
ex
ln x
loga x
π
Rundung
Konversion
18
Einleitung
Sprachelemente
Skripte
Einleitung
Sprachelemente
Skripte
Operatoren
Operatoren
werden infix verwendet, d.h. 3 + 4
Operatoren haben Bindungsstärke oder Fixität (engl. fixity)
z.B.
aber: Verwendung eines Operatorsymbols <op> in
Präfixposition möglich mit Notation (<op>) , d.h.
(+) 3 4 == 3 + 4
* hat Fixität 7,
+ hat 6,
ˆ hat 8,
daher a + b * c == a + (b * c)
und
a ˆ b * c == (a ˆ b) * c
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 I 2009/10 . . .
19
Einleitung
Sprachelemente
Skripte
20
Einleitung
Sprachelemente
Skripte
Operatoren und Funktionen
Konversionen von Operatoren und Funktionen
Funktionsanwendung hat höchste Bindungsstärke
werden Infix-Operatoren in Klammern eingeschlossen, so
können sie als Funktionen vor ihren Argumenten
verwendet werden
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
Beispiel:
(+) :: Int -> Int -> Int
Beispiel: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
für andere Interpretation ist explizite Klammerung
notwendig:
f (n+1)
D. Rösner AuD I 2009/10 . . .
D. Rösner AuD I 2009/10 . . .
21
D. Rösner AuD I 2009/10 . . .
22
Einleitung
Sprachelemente
Skripte
Einleitung
Sprachelemente
Skripte
zwei Arten von Dateistilen:
zwei Arten von Dateistilen: cont
Skripte (Extension ‘.hs’):
alles ist Programmtext, sofern nicht explizit als Kommentar
gekennzeichnet
literate Skripte (Extension ‘.lhs’):
alles ist Kommentar, sofern nicht am Zeilenanfang durch
‘>’ als Programmzeile gekennzeichnet
literat . . . ‘wörtlich’
Kommentare bis Zeilenende eingeleitet durch zwei
aufeinanderfolgende ‘-’
Abschnittskommentare zwischen ‘{-’ und ‘-}’
D. Rösner AuD I 2009/10 . . .
24
Einleitung
Sprachelemente
Skripte
D. Rösner AuD I 2009/10 . . .
25
Einleitung
Sprachelemente
Skripte
Beispiel eines Skripts
Beispiel eines literaten Skripts
Die Berechnung der Funktion Fakultät ist ein
Standardbeispiel fuer Rekursion.
{... 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)
fak :: Int -> Int
Eine Variante mit Pattern-Matching:
fak n = if n == 0 then 1 else n * fak (n - 1)
D. Rösner AuD I 2009/10 . . .
> fak 0 = 1
> fak n = n * fak (n - 1)
26
D. Rösner AuD I 2009/10 . . .
27
Einleitung
Sprachelemente
Skripte
Einleitung
Sprachelemente
Skripte
Literatur: I
Literatur: II
Richard Bird.
Introduction to functional programming using Haskell.
Prentice Hall Europe, 2000.
ISBN 0-13-484346-0; 2nd edition.
Manual M. Chakravarty and Gabriele C. Keller.
An Introduction to Computing with Haskell.
Pearson Education Australia, 2002.
ISBN 1 74009 404 2; also available in German translation.
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 I 2009/10 . . .
28
D. Rösner AuD I 2009/10 . . .
29
Herunterladen