Haskell for Hackers... or why functional programming matters

Ähnliche Dokumente
Motivation Von Funktoren, Komposition, Applikation Zu Monoiden Die Monade Zusammenfassung. Monaden für alle. Franz Pletz

Grundlegende Datentypen

Programmieren in Haskell

Programmieren in Haskell

Einführung in Haskell

Programmieren in Haskell Einstieg in Haskell

WS 2011/2012. Georg Sauthoff November 2011

ALP I. Funktionale Programmierung

Einführung in die funktionale Programmierung

Funktionale Programmierung. Monaden. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Funktionale Programmiersprachen

Praktische Informatik 3

Monaden. 14. Januar 2015

Workshop Einführung in die Sprache Haskell

Prüfung Funktionale Programmierung

Basiskonstrukte von Haskell

Grundlegende Datentypen

Funktionale Programmierung

Lazy Programming Wintersemester 2003 / 2004

Typ-Polymorphismus. November 12, 2014

Proinformatik Marco Block Dienstag, den 21. Juli 2009

Prüfung Funktionale Programmierung

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Funktionale Programmierung Grundlegende Datentypen

Beispiel: Hamming-Folge Erzeuge eine Folge X = x 0,x 2,... mit folgenden Eigenschaften: 1. x i+1 > x i für alle i

Grundlegende Datentypen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 6 vom : Funktionen Höherer Ordnung II und Effizienzaspekte

Paradigmen der Programmierung

Funktionale Programmierung

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

Haskell für Mathematiker

Funktionale Programmierung ALP I. Funktionen höherer Ordnung SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Programmiersprachen: Klassifizierung und Methoden. Programmier-Paradigmen. Grundlagen der Programmierung 2 (1.C) - 1 -

ROGER GILLIAR / MCS GMBH HASKELL FÜR JAVA PROGRAMMIERER

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

WS 2011/2012. Georg Sauthoff 1. November 11, 2011

Grundlagen der Programmierung 2 (1.A)

Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom : Monaden als Berechnungsmuster

Unendliche Listen und Bäume

Funktionale Programmierung Mehr funktionale Muster

Grundlagen der Programmierung 2 A (Listen)

Programmieren in Haskell

Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz

Grundlagen der Programmierung 3 A

11. Funktionale Konzepte in Java

Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1

Übersicht. Nebenläufige Programmierung: Praxis und Semantik. Nebenläufige Programmierung in Haskell (2) Software Transactional Memory in Haskell

Funktionale Programmierung mit Haskell

Hallo Haskell. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :06. Hallo Haskell 1/23

Übersicht. Nebenläufige Programmierung: Praxis und Semantik. Nebenläufige Programmierung in Haskell (2) Design

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur -

Stackmaschine; Speicheradressierung

Hallo Haskell. (Funktionale Programmierung) Prof. Dr. Oliver Braun. Letzte Änderung: :08. Hallo Haskell 1/23

Funktionale Programmierung mit modernem C++ Rainer Grimm Schulungen, Coaching und Technologieberatung

HASKELL KAPITEL 8. Bäume

Funktionale Programmierung. Monoide. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Programmieren in Haskell Programmiermethodik

Einführung in die Informatik 2

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Funktionale Programmierung

Funktionale Programmierung und Typtheorie

Grundlagen der Programmierung 3 A

Programmieren in Haskell

13. Funktionale Konzepte in Java

Funktionale Programmierung

Programmierparadigmen

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell

Informatik I - Programmierung Globalübung Hugs98 Currying. Hugs98 Currying

Haskell, Typen, und Objektorientierung

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen

WS 2011/2012. Robert Giegerich. October 17, 2012

Einführung in die Informatik 2

12 Abstrakte Klassen, finale Klassen und Interfaces

Einführung in die Funktionale Programmierung mit Haskell

Programmierkurs II. Typsynonyme & algebraische Datentypen

WS 2011/2012. Georg Sauthoff 1. October 26, 2011

Typklassen. Natascha Widder

Grundlagen der Programmierung 2 (2.A)

Fahrplan. Inhalt. Ähnliche Funktionen der letzten Vorlesung. Muster der primitiven Rekursion. Ähnliche Funktionen der letzten Vorlesung

Hilfsblatt für C++ Prüfungen im 5. Semester

Gliederung. Funktionale Programmierung. Pattern matching in Haskell. Pattern matching in ERLANG. Materialien zur Vorlesung

Bedarfsgesteuerte Programmierung

Funktionale Programmierung mit modernem C++ Rainer Grimm Schulungen, Coaching und Technologieberatung

Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom : Funktionen Höherer Ordnung I

Grundlagen der Programmierung 2 (1.D)

Funktionale Programmierung mit Haskell. Jan Hermanns

HASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül

Grundlagen der Programmierung 2 (1.A)

Monaden. 6. August 2009

Programmieren in Haskell

Mugda - Abhängige Typen und Termination-Checking

Wir betrachten noch einmal den Datentyp für blattbeschriftete Binärbäume

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

III.1 Prinzipien der funktionalen Programmierung - 1 -

Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension

Transkript:

... or why functional programming matters Franz Pletz <@muc.ccc.de> CCC München 27-06-2009 @ GPN8

Fahrplan Ablauf Motivation 1 Ablauf Motivation 2 3 4

Ablauf Ablauf Motivation bei Fragen/Unklarheiten: sofort dazwischenschreien! so wenig Mathematik wie möglich Prinzipien sprachübergreifend, aber Beschränkung auf Haskell-Syntax Hands-On: paralleles Spielen mit dem Interpreter Ziele: Einführung in allgemeine Prinzipien der funktionalen Programmierung Haskell-Basis schaffen, um die Sprache selbst weitererforschen zu können

Imperative Programmierung Ablauf Motivation hohe Popularität klassicher imperativer Paradigmen folgt aus dem von Neumann Modell Ausführung der Befehle in fixer Reihenfolge interner, globaler State des Programmes definiert Verhalten Probleme Debugging durch Abhängigkeit vom State schwierig Verifikation von Programmen komplex Parallelisierung aufwändig und nicht trivial

Fahrplan 1 2 3 4

Ein paar Worte zu Haskell Paradigmen functional non-strict semantics: Funktionsargumente müssen nicht ausgewertet werden lazy evaluation: Auswertung und Berechnung on demand modular Typsystem static: Typchecks zur Compilezeit strong: keine automatische Typkonvertierung inferred: Typen können implizit abgeleitet werden automatisches Speichermanagement

Prinzip: Funktionen können Funktionen als Argumente oder Rückgabewerte haben Impliziert First-Class Functions: Erzeugung von Funktionen zur Laufzeit und Behandlung als Objekt Auswirkungen Anonyme Funktionen (Lambda, Closures) Currying

Lambda-Ausdrücke Beispiel let f = \x y -> x + y Abgeleiteter Typ: f :: (Num a) => a -> a -> a f: Name Num: Typ bzw. Typklasse, numerisch a: Platzhalter Deutsch: Funktion f nimmt 2 numerische Parameter und gibt einen numerischen zurück Achtung: Immer der selbe Typ a! (z.b. Integer, Fractional)

Lambda-Ausdrücke Beispiel let f = \x y -> x + y Abgeleiteter Typ: f :: (Num a) => a -> a -> a f: Name Num: Typ bzw. Typklasse, numerisch a: Platzhalter Deutsch: Funktion f nimmt 2 numerische Parameter und gibt einen numerischen zurück Achtung: Immer der selbe Typ a! (z.b. Integer, Fractional) Alternative Definition let f x y = x + y

Currying Definition Funktion f f :: (Num a) => a -> a -> a let f x y = x + y Beispiel let f5 = f 5 Was ist der Typ? Semantik?

Currying Definition Funktion f f :: (Num a) => a -> a -> a let f x y = x + y Beispiel let f5 = f 5 Was ist der Typ? Semantik? f5 :: Integer -> Integer initialisiert erstes Argument von f mit 5 f benötigt noch ein Argument, neue Funktion! Num a wird wegen 5 zu Integer spezialisiert

Funktionen ohne Seiteneffekte (kein I/O, Syscalls,... ) gleiche Argumente produzieren immer gleiche Rückgabewerte keine Veränderung gemeinsamer globaler oder statischer Variablen (State) Haskell ist purely functional Folgen Order of Evaluation ist egal Call-by-need Evaluation: Lazy Evaluation implizite Thread-Safety: automatisierte Parallelisierbarkeit

Lazy Evaluation: Beispiele Beispiel 1 let f x y = x + 1 f 1 [0..] [0..] erzeugt eine unendlich lange Liste jedoch keine Berechnung, da nicht benötigt

Lazy Evaluation: Beispiele Beispiel 1 let f x y = x + 1 f 1 [0..] [0..] erzeugt eine unendlich lange Liste jedoch keine Berechnung, da nicht benötigt Beispiel 2 take 2 [0..] take n l nimmt n Elemente aus Liste l unendlich lange Liste wird nur so weit ausgewertet wie benötigt

Datentypen in Haskell werden durch Konstruktoren aufgebaut diese fungieren gleichzeitig als Desktruktoren zum zerlegen Beispiel: Tupel Tupel: (1,2) Zerlegen: let (a,b) = (1,2) in a + b Beispiel: Listen Liste: [1,2,3] mit Cons-Konstruktur: 1:(2:(3:[])) Zerlegen: let (x:xs) = [1,2,3] in x

Datenstrukturen Syntax data <Typ> <Typ1a = <Konstruktor1> <Typ1a> <Konstruktur2>... deriving <Typklasse1>,...

Datenstrukturen Syntax data <Typ> <Typ1a = <Konstruktor1> <Typ1a> <Konstruktur2>... deriving <Typklasse1>,... Beispiel 1 data Maybe t = Just t Nothing

Datenstrukturen (2) Beispiel 2: Binärbaum data BTree t = Node (BTree t) t (BTree t) Leaf deriving Show

Datenstrukturen (2) Beispiel 2: Binärbaum data BTree t = Node (BTree t) t (BTree t) Leaf deriving Show Beispiel 3: Natürliche Zahlen data Nat = Zero Succ Nat

Datenstrukturen (2) Beispiel 2: Binärbaum data BTree t = Node (BTree t) t (BTree t) Leaf deriving Show Beispiel 3: Natürliche Zahlen data Nat = Zero Succ Nat Beispiel 4: Liste data List a = Nil Cons a (List a)

Erzeugung einer neuen Liste aus einer Operation, einer Menge von Quellisten und einer Menge von Prädikaten entspricht der Mengenotation in der Mathematik Beispiel: Quadrat aller geraden Zahlen von 1 bis 9 [ x}{{ x} }{{} x < [1..9], x }{{}} mod {{ 2 == 0} ] Operation Variable Eingabeliste Prädikat

: Beispiele Anwendung einer Funktion für alle Elemente einer Liste let map f xs = [f x x <- xs]

: Beispiele Anwendung einer Funktion für alle Elemente einer Liste let map f xs = [f x x <- xs] Pythagoreische Tripel let pythag n = [(a, b, c) a <- l, b <- l, c <- l, a*a + b*b == c*c] where where l = [1..n]

Problem: Schleifen sind ein imperatives Konzept funktionale Lösung:! Prinzip: Funktion ruft sich selbst auf um selben Code nochmal auszuführen Overhead durch Stack-Management, Compiler können jedoch z.b. Tail-Recursion erkennen und optimieren

: Beispiele Fakultät fac :: Int -> Int fac 0 = 1 fac n = n * fac (n-1)

: Beispiele Fakultät fac :: Int -> Int fac 0 = 1 fac n = n * fac (n-1) Anwendung einer Funktion für alle Elemente einer Liste map :: (a -> b) -> [a] -> [b] map [] = [] map f (x:xs) = (f x):(map f xs)

: Beispiele Quicksort qsort :: (Ord a) => [a] -> [a] qsort [] = [] qsort (x:xs) = (qsort [y y <- xs, y < x]) ++ [x] ++ (qsort [y y <- xs, y >= x])

Fahrplan Datentypen Monaden Module 1 2 3 Datentypen Monaden Module 4

Datentypen Datentypen Monaden Module Vordefinierte Typen, z.b. Int, Integer Float Complex Boolean IO t Klassen Num Eq Show Ord

Datentypen Monaden Module Datentypen (2) Syntax: Neue Datentypen type <Name> = <Typ> Beispiel: Datentyp type FilePath = [String]

Monaden Datentypen Monaden Module Prinzip: Es wird ein weiteres Typsystem in ein bereits vorhandenenes hineinbeschrieben Grundsätzliche Operationen: Typkonstruktion: M t Mappingfunktion: t -> M t in Haskell return x Bindungsoperation: M t -> (t -> M u) -> M u in Haskell >>= oder do-ausdrücke

Monaden Datentypen Monaden Module Prinzip: Es wird ein weiteres Typsystem in ein bereits vorhandenenes hineinbeschrieben Grundsätzliche Operationen: Typkonstruktion: M t Mappingfunktion: t -> M t in Haskell return x Bindungsoperation: M t -> (t -> M u) -> M u in Haskell >>= oder do-ausdrücke Huh?

Monads: Beispiel IO Datentypen Monaden Module IO-Funktionen putstrln :: String -> IO () getline :: IO String readfile :: FilePath -> IO String writefile :: FilePath -> String -> IO ()

Monads: Beispiel IO (2) Datentypen Monaden Module cat let main = getline >>= ( \x -> putstrln x >>= ( \x -> main))

Monads: Beispiel IO (2) Datentypen Monaden Module cat let main = getline >>= ( \x -> putstrln x >>= ( \x -> main)) cat in do-notation let main = do s <- getline putstrln s main

Module Datentypen Monaden Module Moduldefinition am Start der Datei module Name (Name1, Name2,...) where

Module Datentypen Monaden Module Moduldefinition am Start der Datei module Name (Name1, Name2,...) where Moduleinbindung import Name import Name (Name1, Name2,...) import Name hiding (Name1, Name2,...)

Datentypen Monaden Module Module Moduldefinition am Start der Datei module Name (Name1, Name2,...) where Moduleinbindung import Name import Name (Name1, Name2,...) import Name hiding (Name1, Name2,...) Modulname korrespondiert mit Dateipfad Datei: MyProg/Network.hs module MyProg.Network where Einbindung: import MyProg.Network

Fahrplan 1 2 3 4

Vielen Dank fürs Wachbleiben! Noch Fragen?