Monaden in Haskell - ?· Monaden in Haskell Joachim Breitner 16.November2010 Haskell vs. Kategorientheorie…

Download Monaden in Haskell - ?· Monaden in Haskell Joachim Breitner 16.November2010 Haskell vs. Kategorientheorie…

Post on 14-Sep-2018

214 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

<ul><li><p>Monaden in Haskell</p><p>Joachim Breitner</p><p>16. November 2010</p><p>Haskell vs. Kategorientheorie</p><p>Eine Monade in Haskell ist eine Typklasse mit zwei Methoden:</p><p>class Monad m where(=) :: m a (a m b) m breturn :: a m a</p><p>wobei die folgenden Beziehungen gelten sollten:</p><p>return x = f f xa = return a</p><p>(a = f) = g a = (x f x = g).</p><p>Eine Formulierung der blichen Monaden-Definition fr Haskell wre</p><p>class Monad m wheremap :: (a b) m a m breturn :: a m ajoin :: m (m a) m a</p><p>wobei m Typen auf Typen abbildet, also zusammen mit map einen FunktorHask Hask definiert.Es entspricht weiter return dem und join dem .</p><p>Aus den Bedingungen dass und natrliche Transformationen sind, sowie den zwei definierendenkommutativen Diagrammen erhalten wir in Haskell-Schreibweise folgende Eigenschaften:</p><p>map g return return gmap g join join map (map g)</p><p>join map join join joinjoin return join map return id.</p><p>Die beiden Definitionen sind quivalent. Man kann</p><p>map f = (a a = (return f))join a = a = id bzw. a = f = join (map f a)</p><p>definieren und nachrechnen, dass die obigen Bedingungen ineinander bergehen.</p><p>Quellen: http://www.haskell.org/haskellwiki/Category_theory/Monadshttp://www.haskell.org/haskellwiki/User:Michiexile/MATH198</p><p>http://www.haskell.org/all_about_monads/http://comonad.com/reader/</p><p>http://www.haskell.org/haskellwiki/Category_theory/Monadshttp://www.haskell.org/haskellwiki/User:Michiexile/MATH198http://www.haskell.org/all_about_monads/http://comonad.com/reader/</p></li><li><p>Ein kleiner Monadenzoo</p><p>Im folgenden die bekanntesten Haskell-Monaden, in etwas liberalerer Syntax.</p><p>Maybe(Modelliert: partielle Funktionen, Berechnungenmit Fehlerzustnden)</p><p>data Maybe a = Just a | Nothinginstance Monad Maybe where</p><p>return = Just(Just x) = k = k xNothing = k = Nothing</p><p>Either e(Modelliert: Berechnungen mit Fehlermeldun-gen)</p><p>data Either e a = Left e | Right ainstance Monad (Either e) where</p><p>return = Right(Left e) = k = Left e(Right x) = k = k x</p><p>[](Liste. Modelliert: Nichtdeterminismus)</p><p>data [a] = a:[a] | [ ]instance Monad [ ] where</p><p>return x = [x][ ] = k = [ ](x:xs) = k = k x ++ (xs = k)</p><p>Reader r(Leser-Monade. Modelliert: Kontextinformatio-nen)</p><p>type Reader r a = r ainstance Monad (Reader r) where</p><p>return x = r xm = k = r k (m r) r</p><p>Writer m(Schreiber-Monade. Modelliert: Protokollierung.(M,e,) muss ein Monoid sein.)</p><p>type Writer m a = (m,a)instance Monoid m Monad Writer where</p><p>return x = (e, x)m = k = let (m, y) = m</p><p>(m, z) = k ain (m m, z)</p><p>State s(Zustands-Monade. Modelliert: Berechnungenmit Zustand)</p><p>type State s a = s (a,s)instance State s where</p><p>return x = s (x,s)m = k = s let (y, s) = m s</p><p>in k y s</p><p>Cont r(Fortfhrungs-Monade. Modelliert Sprnge imProgrammablauf)</p><p>type Cont r a = (a r) rinstance Monad (Cont r) where</p><p>return x = c c xm = k = c m (a k a c)</p><p>Identity(Modelliert: reine Funktionen)</p><p>type Identity a = ainstance Monad Identity where</p><p>return = idm = k = k m</p><p>IO(Modelliert: Berechnungen, die mit der ech-ten Welt kommunizieren, etwa Dateizugriffe.Implementierung ist Compiler-Geheimnis!)</p><p>type IO = ?instance Monad IO where</p><p>return = ?m = k = ?</p><p>Do-NotationHaskell untersttzt eine spezielle Syntax frmonadische Berechnungen. So steht etwa</p><p>main = do x getLineputStr ("You said " ++ x)return 3</p><p>fr</p><p>main = getLine = (x (putStr ("You said " ++ x) = (_ return 3))).</p></li></ul>