Einführung in die Programmierung mit Haskell

Werbung
Einleitung
Skripte
Sprachelemente
Einleitung
Skripte
Sprachelemente
Gliederung
Algorithmen und Datenstrukturen – Einführung
Einführung in die Programmierung mit Haskell
D. Rösner
Institut für Wissens- und Sprachverarbeitung
Fakultät für Informatik
Otto-von-Guericke Universität Magdeburg
1
Einleitung
2
Skripte
3
Sprachelemente
Winter 2008/2009, 12. Oktober 2008
D. Rösner
D. Rösner
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
Programmiersprache Haskell:
benannt nach Haskell B. Curry
einer der Pioniere des λ-Kalkül
erste Spezifikation der Sprache Ende 80er Jahre
aktuelle Version: Haskell 98
Haskell
Programmierumgebung Hugs
Haskell Users Gofer System
frei erhältlicher Interpreter
für alle gängigen Plattformen
Download, Tutorials, usw.: http://www.haskell.org/
D. Rösner
AuD 2008/2009 . . .
D. Rösner
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
Einleitung
Skripte
Sprachelemente
Haskell
funktionale Programme in Haskell
Elementarer Einstieg
verwende Hugs als ’Taschenrechner’
Grundrechenarten:
Addition: +
Subtraktion: Multiplikation: *
Division:
Definitionen von Funktionen und anderen Werten durch
Gleichungen
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 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
funktionale Programme in Haskell cont.
lies ‘::’ als ‘hat Typ’ oder ‘ist vom Typ’
Beispiele:
size :: Int
size = 12 + 13
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 ‘-}’
square :: Int -> Int
square n = n * n
D. Rösner
D. Rösner
AuD 2008/2009 . . .
D. Rösner
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
Einleitung
Skripte
Sprachelemente
zwei Arten von Dateistilen: cont
Beispiel eines Skripts
{... mehrere Zeilen Kommentartext ...
literate Skripte (Extension ‘.lhs’):
alles ist Kommentar, sofern nicht am Zeilenanfang durch
‘>’ als Programmzeile gekennzeichnet
literat . . . ‘wörtlich’
-}
-- 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
Skripte
Sprachelemente
D. Rösner
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
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:
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)
> fak 0 = 1
> fak n = n * fak (n - 1)
D. Rösner
AuD 2008/2009 . . .
D. Rösner
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
Einleitung
Skripte
Sprachelemente
Haskell – Sprachelemente
Zur Unterscheidung zwischen Int und Integer
vordefinierte elementare Typen (auch Sorten genannt) für
Konstante (= nullstellige Funktionen):
Bool
Int
Char
Float
Integer
Rational
Double
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.
Vorschau: durch Deklaration mit type lassen sich
benutzerdefinierte Typen einführen
D. Rösner
D. Rösner
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
Typisierung cont.
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 . . .
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
Skripte
Sprachelemente
Einleitung
Skripte
Sprachelemente
vordefinierte arithmetische Operatoren
vordefinierte arithmetische Operatoren cont.
+ . . . 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
mod . . . Rest bei ganzzahliger Division (modulo)
abs . . . Absolutbetrag
negate . . . ändere Vorzeichen
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
D. Rösner
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
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
div . . . ganzzahlige Division
AuD 2008/2009 . . .
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
Skripte
Sprachelemente
Einleitung
Skripte
Sprachelemente
Operatoren
Operatoren und Funktionen
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
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
Skripte
Sprachelemente
AuD 2008/2009 . . .
Einleitung
Skripte
Sprachelemente
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
Funktionsanwendung hat höchste Bindungsstärke
AuD 2008/2009 . . .
Literatur (Auswahl):
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.
Graham Hutton.
Programming in Haskell.
Cambridge University Press, 2006.
ISBN 0521692695.
D. Rösner
AuD 2008/2009 . . .
Herunterladen