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