v2 alp1 haskell einführung 2013 - inf.fu- ?· was ist haskell? haskell ist eine rein funktionale...

Download V2 ALP1 Haskell Einführung 2013 - inf.fu- ?· Was ist Haskell? Haskell ist eine rein Funktionale Programmiersprache…

Post on 15-Jul-2018

212 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • ALP IEinfhrung in Haskell

    Prof. Dr. Margarita Esponda

    WS 2012/2013

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • Was ist Haskell?

    Haskell ist eine rein Funktionale

    Programmiersprache mit einer nach Bedarf

    Auswertung-Strategie oder "Lazy Evaluation".

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • Was bedeutet rein funktional?

    - Programme werden als mathematische Funktionen dargestellt

    - Haskell Funktionen haben keine Seiteneffekte.

    keine Seiteneffekte Referenzielle Transparenz

    - Eine Funktion liefert immer bei gleicher Eingabe das gleiche Ergebnis.

    - Der Wert eines Ausdrucks hngt nur von den Werten der aktuellen Parameter ab.

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • Funktionen

    e1e2..en

    aFEingabewerte nur ein Ausgabewert

    Das Ergebnis einer Funktion hngt nur von den Eingabewerten ab.

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

    f ( x , y ) = x 2 + y 3

    Beispiel:

    1f ( 1 , 2 ) 2

  • Funktionen

    +12 3

    Arithmetische Operationen knnen auch als Funktionen betrachtet werden

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

    ( + ) ( x , y ) = x + y 3

    1 2

  • Funktionen in Haskell

    Einfache Funktionsdefinitionen in Haskell:

    f e1 e2 en... = Funktionskrper

    quadrat x = x*x

    Funktionsname

    Eingabeargumente ohne Klammern und Kommas

    Ausdruck, dessen Wert dem Ergebnis der Funktion

    entspricht

    f x = x*x

    Allgemeine Syntax:

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • Funktionsapplikation

    Die Anwendung einer Funktion mit konkreten Argumenten wird als Funktionsapplikation bezeichnet.

    1*0 + 1*2 0 + 2

    2

    f x y z = x*y + x*zFunktionsdefinition:

    Funktionsapplikation:

    Die Variablen auf der rechten Seite der Funktionsdefinition werden durch die entsprechenden konkreten Argumente ersetzt.

    Funktionsreduktion

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

    f 1 0 2

  • Normalform

    Kann ein Ausdruck nicht mehr weiter reduziert werden, dann befindet er sich in seiner Normalform und die Berechnung ist beendet.

    Beispiele:

    "text"

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

    Ausdruck Normalform des Ausdruck

    3 + 7 10sin 0 0.0

    "text"

    Zahlen

    "1 + 2" "1 + 2"'2' '2'

    Zeichenkette

    Zeichen

  • Auswertungsstrategie

    Innerhalb eines Ausdrucks kann es mehrere Funktionsapplikationen geben.

    Die Reihenfolge, in der unabhngige Teilausdrcke ausgewertet werden, verndert nicht den Wert des gesamtes Ausdrucks.

    Aber verschiedene Reihenfolgen knnen die Anzahl der notwendigen Berechnungen stark beeinflussen.

    Eine Auswertungsstrategie kann sogar entscheiden, ob eine Berechnung beendet werden kann oder nicht.

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • Bottom ()

    Wenn die Auswertung eines Ausdrucks zu einer unendlichen Folge von Reduktionen fhrt, wird entweder

    das Programm nicht beendet oder

    es strzt ab, weil der Speicher voll wird.

    In der Theorie wird das Symbol Bottom verwendet, um den Wert von Ausdrcken darzustellen, die nicht vollstndig ausgewertet werden knnen (die divergent sind).

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • Bottom ()

    Bottom kann in Haskell wie folgt ausgedrckt

    werden:

    bottom = bottom

    In dem Prelude-Module ist eine Funktion dafr

    definiert:

    undefined = error "Prelude; undefined"

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • AuswertungsstrategienFunktionsbeispiele: g x = 2 * x

    f x = x + x

    Auszuwertender Ausdruck: f (g 5)Call-by-value

    Ausdrcke werden von innen nach auen und von links nach rechts ausgewertet.

    f (g 5) f (2 * 5) f 10

    10 + 10 20

    Call-by-nameAusdrcke werden von auen nach innen ausgewertet.f (g 5) (g 5) + (g 5)

    (2*5) + (g 5) 10 + (g 5) 10 + (2*5)

    10 + 10 20

    Es wird garantiert, dass die Argumente zuerst ausgewertet werden und dann an die Funktion weitergegeben werden.

    Ohne die Argumente auszuwerten, werden zuerst die usseren Funktionen angewendet.

    Prof. Dr. Margarita Esponda

    Auswertungsstrategien

  • Auswertungsstrategie in HaskellCall-by-need oder Lazy-evaluation

    Auswertung nach Bedarf

    Lazy-evaluation ist eine optimierte Auswertungsvariante von

    call-by-name und wird in Haskell und anderen funktionalen

    Sprachen verwendet.

    Beispiel:

    f (g 5) (g 5) * (g 5) where g 5 = 2*5 (g 5) * (g 5) where g 5 = 10 10 * 10 100 call-by-need ist eine Art

    call-by-name-Auswertungsstrategie mit Gedchtnis

    Prof. Dr. Margarita Esponda

    Auswertungsstrategien

    g x = 2 * xf x = x * x

  • Auswertungsstrategie in Haskell

    Call-by-need oder Lazy-evaluationAuswertung nach Bedarf

    Definitionen:

    Prof. Dr. Margarita Esponda

    Auswertungsstrategien

    f y x = (2 + y) + x * xdouble x = 2 * x

    f 6 (double 3) (2 + 6) + *

    (double 3)

    8 + *

    (double 3)

    8 + *

    (2*3) 8 + *

    6 8 + 36

    44

    f 6 (double 3)

    Anwendung:

  • Strikte FunktionenInformell kann man sagen, dass eine Funktion f strikt nach einem ihrer Argumente a ist, wenn fr die Auswertung der Funktion, die Auswertung von a notwendig ist.

    Formale Definition:

    f ist strikt f = Beispiel: Die + Funktion ist strikt nach beiden Argumenten

    (2*4) + (5*6)

    oder

    (+) (2*4) (5*6) (2*4) + (5*6) 8 + 30 38

    Prof. Dr. Margarita Esponda

    Auswertungsstrategien

  • Haskell - Auswertungsstrategieist nicht strikt

    Ausdrcke werden nur bei Bedarf ausgewertet im Gegensatz zu imperative Sprachen, in denen eager-evaluation

    verwendet wird.

    Beispiel: x = x + 1

    g a = a

    f a b = b

    g 5 5

    g x g

    f 2 3 3f x 3 3f 2 x f 2

    weil die Auswertung von x nicht terminiert

    g ist strikt nach a

    f ist strikt nach b, aber nicht nach a

    x x + 1 (x + 1) + 1 ((x + 1) + 1) + 1 . . .

    Prof. Dr. Margarita Esponda

    Auswertungsstrategien

  • Ein Haskell-Programm besteht aus einer Reihe von Funktionen und einem Ausdruck, der ausgewertet werden soll.

    Haskell-Programm

    rectArea a b = a*b

    rectPerimeter a b = 2*(a+b)

    Name.hs

    Eine Reihe von Funktionsdefinitionen werden in eine Skript-Datei geschrieben

    mit der Kommandozeile

    :load Name.hs

    wird diese vom Haskell-Interpreter gelesen.

    Dann knnen Ausdrcke damit ausgewertet werden.

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

    (rectArea 4 5) + (rectArea 2 1)

  • Berechnungsmodel

    Funktionsdefinitionen werden als Ersetzungsregeln interpretiert

    Ausdrcke werden damit zu einem Wert (Normalform) reduziert

    Hat ein Ausdruck keine reduzierbaren Teilausdrcke, so ist er in Normalform

    In Haskell werden Ausdrcke nur nach Bedarf ausgewertet.

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • Pseudo-Funktionen mit Seiteneffekte

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

    e1e2..en

    aF

    Der Zustand einer globalen Variable wird verndert

    Eingabe der Zeit abhngig ist

    Eine Funktion, die whrend Ihrer Berechnung globale Daten in irgend ein Speichermedium manipuliert, verndert damit der Zustand der Ausfhrung-Umgebung und produziert damit Seiteneffekte.

  • keine Seiteneffekte Referentielle Transparenz

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

    Vorteile der referentiellen Transparenz

    - Die Korrektheit der Programme oder einfache Eigenschaften knnen mit klassischen mathematischen Verfahren geprft werden.

    - Die Wartung ist einfacher, weil die Auswertung von Teilausdrcken Kontext und Zeit unabhngig sind.

    - Wichtige Optimierungen durch den Compiler sind mglich

    - Parallele Auswertung von Teilausdrcke

    - gleiche Ausdrcke werden nur ein mal ausgewertet

    - usw.

  • Datentypen Ein Datentyp entspricht dem Wertbereich, den die Argumente

    oder das Ergebnis einer Funktion haben knnen.

    Jeder Ausdruck in Haskell hat einen wohldefinierten Datentyp.

    Funktionen werden oft nur fr bestimmte Datentypen definiert.

    Der Datentyp von Variablen oder Ausdrcken wird durch explizite Deklaration oder durch Typ-Inferenz festgestellt.

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • DatentypenExplizite Deklaration des Datentyps einer Funktion

    sum :: Int -> Int -> Int

    sum a b = a + b

    Syntax:Funktionsname :: Funktionstyp

    Typ-SignaturBeispiele:

    doppel :: Int -> Int

    doppel a = 2*a

    pi :: double

    pi = 3.141598

    Konstante Funktion

    Prof. Dr. Margarita Esponda

    Funktionale Programmierung

  • Datentypen

    Haskell hat ein statisches Typsystem

    Der Datentyp der Funktionen wird statisch whrend der

    bersetzungszeit des Programms abgeleitet.

    Vorteile: