Haskell – Sprachelemente Haskell – Sprachelemente Zur

Werbung
Haskell – Sprachelemente
Haskell – Sprachelemente
• vordefinierte elementare Typen (auch Sorten genannt) für Konstante (=
nullstellige Funktionen):
• Typisierung: jedes Objekt in Haskell hat einen wohldefinierten Typ
• Zweck der Typisierung:
Bool
Int
Char
Float
Integer
Rational
Double
– frühzeitiges Erkennen von Programmierfehlern (type checking)
– schon vor Programmausführung (statische Analyse)
• durch Deklaration mit type lassen sich benutzerdefinierte Typen einführen
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 21
Zur Unterscheidung zwischen Int und Integer
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 22
Typisierung cont.
• Zur Klasse Int gehören ganze Zahlen, die sich mit einer festen Zahl von
Bytes darstellen lassen.
• Typ von Funktionen (auch Funktionalität genannt) :
Definitions- und Wertebereich durch -> getrennt angegeben
• der Wert der Variablen maxBound::Int gibt die grösste als Int darstellbare ganze Zahl an. Dieser Wert ist 2147483647.
• Beispiel:
double :: Int -> Int
double n = 2*n
• Will man beliebig grosse ganze Zahlen verarbeiten, so sollte man den Typ
Integer verwenden.
• bei mehreren Argumenten werden deren Typen durch -> verbunden
• Beispiel: max mit 2 Argumenten aus Int und Wert aus Int
max :: Int -> Int -> Int
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 23
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 24
Typisierung cont.
vordefinierte arithmetische Operatoren
• Interpretation einer Typdeklaration wie
scale :: Picture -> Int -> Picture
• + . . . Summe zweier Zahlen
• * . . . Produkt zweier Zahlen
• erstens: scale hat zwei Argumente: das erste ist vom Typ Picture, das
zweite vom Typ Int
• ˆ . . . Exponentiation: 2 ˆ 3 gibt 8
• zweitens: das Ergebnis der Anwendung von scale ist vom Typ Picture
• - ...
– Differenz, wenn infix verwendet;
– umgekehrtes Vorzeichen bei Präfixverwendung (vgl. negate)
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 25
vordefinierte arithmetische Operatoren cont.
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 26
vordefinierte Vergleichsoperatoren
• div . . . ganzzahlige Division
• für ganze Zahlen, d.h. Typ Int -> Int -> Bool:
>, >=, ==, / =, <=, <
• mod . . . Rest bei ganzzahliger Division (modulo)
• abs . . . Absolutbetrag
• diese Vergleichsoperatoren sind – wie auch die arithmetischen Operatoren
– ‘überladen’ und auch auf Float anwendbar
• negate . . . ändere Vorzeichen
• 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 Typvariable)
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 27
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 28
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
Bem.
• 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
xn
xy
ex
ln x
loga x
π
• 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
Rundung
Konversion
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), Operatoren
29
Operatoren und Funktionen
• 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
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 30
Konversionen von Operatoren und Funktionen
• Funktionsanwendung hat höchste Bindungsstärke
• allgemeine Schreibweise: Funktionsname vor Argumente(e)
f v1 v2 ...vn
• Beachte: da Funktionsanwendung höhere Bindung als jeder andere Operator wird f n+1 interpretiert als (f n)+1
• 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
• für andere Interpretation ist explizite Klammerung notwendig: f (n+1)
a ‘max‘ b == max a b
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 31
c Prof. Dr. D. Rösner; erstellt: 5. April 2007
Sommer 2007, Programmierparadigmen (PGP), 32
Herunterladen