Monaden Funktionale Programmierung Einführung in Monaden D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg c Sommer 2013, 10. Mai 2013, 2011-13 D.Rösner D. Rösner FP 2013 . . . 1 Monaden Gliederung 1 Monaden Einführung Maybe D. Rösner FP 2013 . . . 2 Monaden Einführung Maybe Monaden in Haskell Was sind Monaden? A monad is a way to structure computations in terms of values and sequences of computations using those values. Monads allow the programmer to build up computations using sequential building blocks, which can themselves be sequences of computations. The monad determines how combined computations form a new computation and frees the programmer from having to code the combination manually each time it is required. It is useful to think of a monad as a strategy for combining computations into more complex computations. aus [New00] D. Rösner FP 2013 . . . 4 Monaden Einführung Maybe Monaden in Haskell For the programmer, monads are useful tools for structuring functional programs. They have three properties that make them especially useful: 1 2 3 Modularity Flexibility Isolation s.a. [New00] D. Rösner FP 2013 . . . 5 Monaden Einführung Maybe Monaden in Haskell 1 Modularity: They allow computations to be composed from simpler computations and separate the combination strategy from the actual computations being performed. 2 Flexibility: They allow functional programs to be much more adaptable than equivalent programs written without monads. This is because the monad distills the computational strategy into a single place instead of requiring it be distributed throughout the entire program. 3 Isolation: They can be used to create imperative-style computational structures which remain safely isolated from the main body of the functional program. This is useful for incorporating side-effects (such as I/O) and state (which violates referential transparency) into a pure functional language like Haskell. D. Rösner FP 2013 . . . 6 Monaden Einführung Maybe Monaden in Haskell Erinnerung: Typkonstruktoren sind in Haskell parametrisierte Typdefinitionen, bei denen polymorphe Typen verwendet werden Beispiel: data Maybe a = Nothing | Just a dabei Maybe ist Typkonstruktor Just und Nothing sind Datenkonstruktoren konkrete Daten werden durch Anwendung eines Datenkonstruktors gewonnen: city = Just "Magdeburg" analog werden Typen durch Anwendung eines Typkonstruktors gewonnen: lookupAge :: DB -> String -> Maybe Int s.a. [New00] D. Rösner FP 2013 . . . 8 Monaden Einführung Maybe Monaden in Haskell polymorphe Typen: können als Behälter (container) für Werte aus vielen verschiedenen Typen gesehen werden Beispiel: Maybe Int ist ein Behälter, in dem Werte aus Int oder Nothing enthalten Maybe String ist ein Behälter, in dem Werte aus String oder Nothing enthalten weitere Verallgemeinerung: In Haskell, we can also make the type of the container polymorphic, so we could write ’m a’ to represent a container of some type holding a value of some type! s.a. [New00] D. Rösner FP 2013 . . . 9 Monaden Einführung Maybe Monaden in Haskell Beispiel für Nutzung von Maybe: ein Programm, das Daten über Experimente mit geklonten Schafen verwaltet bei der Darstellung von Vorfahrenbeziehungen ist zu berücksichtigen, dass nicht immer beide Eltern existieren type Sheep = ... father :: Sheep -> Maybe Sheep father = ... mother :: Sheep -> Maybe Sheep mother = ... s.a. [New00] D. Rösner FP 2013 . . . 10 Monaden Einführung Maybe Monaden in Haskell das Bestimmen von Grosseltern muss dies berücksichtigen: maternalGrandfather :: Sheep -> Maybe Sheep maternalGrandfather s = case (mother s) of Nothing -> Nothing Just m -> father m das Bestimmen von Urgrosseltern ist noch komplizierter: mothersPaternalGrandfather :: Sheep -> Maybe Sheep mothersPaternalGrandfather s = case (mother s) of Nothing -> Nothing Just m -> case (father m) of Nothing -> Nothing Just gf -> father gf s.a. [New00] D. Rösner FP 2013 . . . 11 Monaden Einführung Maybe Monaden in Haskell Regel: wenn im Verlauf hintereinander ausgeführter Berechnungen an irgendeiner Stelle Nothing entsteht, kann das Gesamtergebnis ebenfalls nur Nothing sein diese Regel zum Umgang mit Nothing kann in einem Kombinator (Funktion höherer Ordnung) zusammengefasst werden -- comb is a combinator for sequencing operations -- that return Maybe comb :: Maybe a -> (a -> Maybe b) -> Maybe b comb Nothing _ = Nothing comb (Just x) f = f x damit: Bestimmen von Urgrosseltern mothersPaternalGrandfather :: Sheep -> Maybe Sheep mothersPaternalGrandfather s = (Just s) ‘comb‘ mother ‘comb‘ father ‘comb‘ father s.a. [New00] D. Rösner FP 2013 . . . 12 Monaden Einführung Maybe Monaden in Haskell Bemerkungen: die Funktion comb ist völlig polymorph comb realisiert eine allgemeine Strategie, um Berechnungen zu verknüpfen, bei denen es sein kann, dass kein Wert zurückgegeben wird zusammengefasst: The happy outcome is that common sense programming practice has led us to create a monad without even realizing it. s.a. [New00] D. Rösner FP 2013 . . . 13 Monaden Einführung Maybe Literatur: I Paul Hudak. The Haskell School of Expression – Learning Functional Programming through Multimedia. Cambridge University Press, Cambridge, UK, 2000. ISBN 0-521-64338-4. Jeff Newbern. All about monads – a comprehensive guide to the theory and practice of monadic programming in haskell, 2000. available at http://www.nomaware.com/monads/monad-tutorial.zip. D. Rösner FP 2013 . . . 14