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 . . .