Funktionale Programmierung - Einführung in Monaden

Werbung
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
Herunterladen