\begin{slide}{Muster und Funktionales Programmieren}

einige Muster simulieren Funktionen als \emph{first class objects}.

(In Java kann ein Unterprogramm nicht Argument oder Resultat
eines Unterprogramms sein, nicht Attribut eines Objektes.)

Typische Anwendungen: 

\emph{Befehl} (z. B. ActionListener), 

\emph{Strategie} (z. B. Comparator).

\end{slide}

\begin{slide}{Muster und Meta-Programmierung (II)}

einige Muster simulieren 
(die in der meisten OO-Sprachen fehlenden) 
Funktionen höherer Ordnung.

\begin{verbatim}
map :: ( a -> b ) -> ( [a] -> [b] )
map f []       = []
map f (x : xs) = f x : map f xs

map ( \ x -> 3 * x ) [ 1, 2, 5 ] 
    == [ 3, 6, 15 ]
\end{verbatim}

Vergleiche Besucher, Iterator


\newpage


Besucher, Iterator für Bäume:

\begin{verbatim}
data Tree a 
   = Leaf
   | Node { left :: Tree a
          , key  :: a
          , right :: Tree a
          }

tmap :: ( a -> b ) -> ( Tree a -> Tree b )

class Functor c where
    fmap :: (a -> b) -> c a -> c b

instance Functor List ; instance Functor Tree
\end{verbatim}
\end{slide}

