Haskell für Mathematiker

Ähnliche Dokumente
Prüfung Funktionale Programmierung

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

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

Programmieren in Haskell

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

Monoide. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :54. Monoide 1/16

Einführung in Haskell

Paradigmen der Programmierung

Grundlegende Datentypen

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

Programmieren in Haskell

Funktionale Programmierung Grundlegende Datentypen

Unendliche Listen und Bäume

Programmieren in Haskell Einstieg in Haskell

Informatik-Seminar Thema: Monaden (Kapitel 10)

Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1

Basiskonstrukte von Haskell

Einführung in die Funktionale Programmierung mit Haskell

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

Einführung in die funktionale Programmierung

Programmierkurs II. Typsynonyme & algebraische Datentypen

Programmieren in Haskell

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

Programmieren in Haskell Das Haskell Typsystem

Einführung in die funktionale Programmierung

9 Algebraische Datentypen

Funktionale Programmierung ALP I. Algebraische Datentypen und Abstrakte Datentypen. SS 2013 Prof. Dr. Margarita Esponda. Prof. Dr.

Rekursive Abstiegsparser sind durch gegenseitig rekursive Funktionen - eine für jedes Nichtterminalsymbol der Grammatik - definiert.

Typklassen, Eingabe und Monaden In Haskell

Programmieren in Haskell

Einführung in die Informatik 2

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

Funktionale Programmierung und Typtheorie

Crashkurs: Haskell. Mentoring FU Berlin Felix Droop

Crashkurs Haskell Mentoring WiSe 2016/17. Anja Wolffgramm Freie Universität Berlin

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

Typklassen. Natascha Widder

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

Einführung in die Informatik 2

Funktionale Programmierung mit Haskell

Fortgeschrittene Funktionale Programmierung mit Haskell

Zahlen in Haskell Kapitel 3

Grundlagen der Programmierung 3 A

1 Algorithmische Grundlagen

Teil III. Funktionale Programmierung in Haskell

Einführung in die Funktionale Programmierung mit Haskell

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

Workshop Einführung in die Sprache Haskell

Kapitel 6: Abstraktion. Programmieren in Haskell 1

2.3 Spezifikation von Abstrakten Datentypen

Typklassen und Überladung in Haskell

Proseminar: Perlen der Informatik II Haskell List comprehensions & Typklassen

Programmierparadigmen

CGI Programmierung mit Ha. Markus Schwarz

Transkript:

Haskell für Mathematiker Joachim Breitner AG Seminar Topology 12. Mai 2016, Karlsruhe LEHRSTUHL PROGRAMMIERPARADIGMEN 1 KIT 19.2.2016 University of the Joachim State ofbreitner Baden-Wuerttemberg - Haskell für Mathematiker and LEHRSTUHL PROGRAMMIERPARADIGMEN National Research Center of the Helmholtz Association www.kit.edu

Übersicht Crash-Kurs Haskell-Syntax Rein funktionale Programmierung Typen Monaden und Kategorientheorie Lazyness Die Topologie von Haskell Beweise in Haskell? Wie gehts weiter? 2 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Funktionen Funktion definieren: collatz 1 = 0 collatz n even n = collatz (n div 2) odd n = collatz (3 n + 1) 3 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Funktionen Funktion definieren: collatz 1 = 0 collatz n even n = collatz (n div 2) odd n = collatz (3 n + 1) Funktion verwenden: Main> map collatz [1..25] [0,1,7,2,5,8,16,3,19,6,14,9,9,17,17,4,12,20,20,7,7,15,15,10,23] 3 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Datentypen data Tree a = Leaf a Node (Tree a) (Tree a) leftmost (Leaf a) = a leftmost (Node t1 _) = leftmost t1 mirror (Leaf a) = a mirror (Node t1 t2) = Node (mirror t2) (mirror t1) flatten :: (a -> a -> a) -> Tree a -> a flatten (<>) = go where go (Leaf a) = a go (Node t1 t2) = go t1 <> go t2 4 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Typsystem Primitive Basis-Typen: Int, Integer, Double Der Funktionstyp: (->) Algebraische Datentypen: Bool, [a], (a,b), Maybe a, Either a b Typsynonyme: type RatTree = Tree (Int,Int) Der eingebaute IO-Typ: IO a 5 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Typsystem Primitive Basis-Typen: Int, Integer, Double Der Funktionstyp: (->) Algebraische Datentypen: Bool, [a], (a,b), Maybe a, Either a b Typsynonyme: type RatTree = Tree (Int,Int) Der eingebaute IO-Typ: IO a Wenn es kompiliert, dann funktioniert es. 5 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Typsystem Primitive Basis-Typen: Int, Integer, Double Der Funktionstyp: (->) Algebraische Datentypen: Bool, [a], (a,b), Maybe a, Either a b Typsynonyme: type RatTree = Tree (Int,Int) Der eingebaute IO-Typ: IO a Wenn es kompiliert, dann funktioniert es. Weitere Vorteile: Typ-geführtes Programmieren. Einfaches Refactoring. Typen sind Dokumentation. 5 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Rein Funktionale Programmierung Funktionen sind wirklich Funktionen! Gleiche Eingabe heißt gleiche Ausgabe Kein globaler Zustand, keine Seiteneffekte einfacher zu verstehen, zu verändern, richtig zu machen 6 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Rein Funktionale Programmierung Funktionen sind wirklich Funktionen! Gleiche Eingabe heißt gleiche Ausgabe Kein globaler Zustand, keine Seiteneffekte einfacher zu verstehen, zu verändern, richtig zu machen Funktionen sind Daten erster Klasse: Funktionen dürfen an Funktionen übergeben werden (siehe flatten) Funktionen können in Datenstrukturen gespeichert werden sehr ausdrucksstark 6 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Typklassen Typklassen erlauben Algorithmen abstrakt zu fomulieren: class Semigroup a where (&) :: a -> a -> a Law: (x & y) & z x & (y & z) flattens :: Semigroup a => Tree a -> a flattens (Leaf a) = a flattens (Node t1 t2) = flattens t1 & flattens t2 7 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Typklassen Typklassen erlauben Algorithmen abstrakt zu fomulieren: class Semigroup a where (&) :: a -> a -> a Law: (x & y) & z x & (y & z) flattens :: Semigroup a => Tree a -> a flattens (Leaf a) = a flattens (Node t1 t2) = flattens t1 & flattens t2 Konkrete Typen können mit einer Instanz versehen werden: instance Semigroup Integer where (&) = (+) instance Semigroup [a] where (&) = (++) instance Semigroup a => Semigroup (Maybe a) where Nothing & Nothing = Nothing Just x & Nothing = Just x Nothing & Just x = Just x Just x1 & Just x2 = Just (x1 & x2) 7 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Monaden in Haskell A monad is just a monoid in the category of endofunctors, what s the issue? 8 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Monaden in Haskell A monad is just a monoid in the category of endofunctors, what s the issue? Eine Monade in Haskell ist eine Typklasse: class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b Monad-Laws: return a >>= f f a m >>= return m (m >>= f) >>= g m >>= (\x -> f x >>= g) 8 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Einige Monaden Ein potentieller Wert: instance Monad Maybe Viele mögliche Werte: instance Monad [] Ein Wert, der von einem Parameter abhängt: instance Monad ((->) b) Berechnungen, die etwas protokollieren: instance Monoid m => Monad (Writer m) newtype Writer m a = Write (m,a) Zustandsbehaftete Berechnungen: instance Monad (State m) newtype State s a = State (s -> (s,a)) Ein String-Parser: instance Monad Parser newtype Parser x = Parser (String -> Maybe (String, x)) Ein Wert, der mit der echten Welt interagiert: instance Monad IO 9 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Kategorientheoretische Monaden Mögliche alternative Definition: class Monad m where Laws: map g. pure pure. g map :: (a -> b) -> m a -> m b map g. join join. map (map g) pure :: a -> m a join. map join join. join join :: m (m a) -> m a join. return join. map return id 10 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Kategorientheoretische Monaden Mögliche alternative Definition: class Monad m where Laws: map g. pure pure. g map :: (a -> b) -> m a -> m b map g. join join. map (map g) pure :: a -> m a join. map join join. join join :: m (m a) -> m a join. return join. map return id Äquivalenz: map f = (\a -> a >>= (return. f)) pure = return return = pure join a = a >>= id a >>= f = join (map f a) 10 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Kategorientheoretische Monaden Mögliche alternative Definition: class Monad m where Laws: map g. pure pure. g map :: (a -> b) -> m a -> m b map g. join join. map (map g) pure :: a -> m a join. map join join. join join :: m (m a) -> m a join. return join. map return id Äquivalenz: map f = (\a -> a >>= (return. f)) pure = return return = pure join a = a >>= id a >>= f = join (map f a) Kategorientheorie: m bildet Typen (Objekte) auf Typen ab map Funktionen (Morphismen) auf Funktionen wir haben einen Funktor Hask Hask. pure entspricht ε, join dem µ. 10 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

do-notation Schöne Syntax für monadische Werte: z.b. IO: main = do input <- readline let w = words input putstrln $ "You entered "++ show (length w) ++ "words." main = readline >>= (\input -> let w = words input in putstrln $ "You entered "++ show (length w) ++ "words.") 11 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

do-notation Schöne Syntax für monadische Werte: z.b. Parser: rangeparser :: Parser [Word16] rangeparser = concat <$> onerangeparser sepby1 many1 (char < > char, ) onerangeparser :: Parser [Word16] onerangeparser = do n <- read fmap many1 digit <?> "Number" skipmany (char ) choice [ do char - n <- read fmap many1 digit <?> "Number" unless (n > n) $ fail $ printf "%d is not larger than %d" n n return [n..n ], return [n] ] 12 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Lazyness In Haskell herrscht Bedarfsauswertung: f x y = if x < 0 then x x else x y f (-2) (3 div 0) = if -2 < 0 then (-2) (-2) else (-2) (3 div 0) = if True then (-2) (-2) else (-2) (3 div 0) = (-2) (-2) = 4 Ermöglicht mehr und einfachere Abstraktion unendliche Datenstrukturen enumerate :: [a] -> [(Integer, a)] enumerate = zip [1..] lustige und obskure Beweistricks (Watkinss Beweis von Conways Lost Theorem) 13 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Die Topologie von Haskell Alle Typen sind partiell geordnet (mit kleinstem Element und Limiten von gerichteten Ketten, pcpo), z.b. Bool und [()]:.... () : [] : () : : : [] : : ( : ) () : : [] : : True False [] : Definierbare Funktionen sind monoton und stetig. Dazu kann man die Scott-Topolgie nehmen: Abgeschlossen sind die nach unten abgeschlossenen Mengen, die ihre Suprema enthalten. 14 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Beweisen mit Haskell Mehrere Ansätze: Entscheidungsprozeduren in Haskell implementieren Dank Typsystem und Reinheit weniger Fehleranfällig, aber immernoch unverifiziert. Obskure Tricks mit Lazyness Howard-Curry-Isomorphismus Aussagen Typen Beweise Programme (Terme) curry :: ((a,b) -> c) -> (a -> b -> c) curry = \f x y -> f (x,y) uncurry :: (a -> b -> c) -> ((a,b) -> c) uncurry = \f p = case p of (x,y) -> f x y Besser geeignet für ernsthafte Beweise: Coq, Agda, (Isabelle) 15 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Bibliotheken Hackage (http://hackage.haskell.org mit fast 1000 Paketen Installierbar mit cabal install oder stack install Für viele praktischen Probleme gute Bibliotheken Parser Datenformate lesen und schreiben Datenbanken Grafik GUI Web-Zeug uvm. Einiges zu Algebra (algebra, constructive-algebra), wenig zu Topologie Keine (ernstzunehmende) Anbindung zu Gap, Sage, Mathemathica 16 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Fazit Programmieren mit Haskell geht schneller produziert weniger Bugs ist für echte Anwendungen geeignet und macht mehr Spaß 17 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

Und wie geht es weiter? http://haskell.org Tutorials und Bücher, z.b. Learn You a Haskell for Great Good! #haskell im IRC haskell-cafe@haskell.org Mailing-Liste [haskell] auf stackoverflow.com 18 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN

c 2016 Joachim Breitner. Distributed under the terms of the Creative Commons Attribution license. 19 19.2.2016 Joachim Breitner - Haskell für Mathematiker LEHRSTUHL PROGRAMMIERPARADIGMEN