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