\begin{slide}{Funktionales und paralleles Programmieren}

(rein) funktionales Programmieren:

keine (Neben-)Wirkungen, keine Zuweisungen,
alle \glqq Variablen\grqq\ 
und \glqq  Objekte\grqq\ sind konstant,
nur Auswertung von Unterprogrammen,

\emph{ist trivial parallelisierbar und thread-sicher}:

alle Argumente eines Unterprogrammes können
parallel ausgewertet werden.


\end{slide}


\begin{slide}{Parallele Auswertungsstrategien}

Steuern der Auswertung durch Angabe von Strategien,

unter Benutzung der Kombinatoren
\begin{itemize}
\item \verb|par x y| \emph{Spark} für x, Resultat ist y
\item \verb|pseq x y| auf x warten, dann Resultat  y
\end{itemize}
Spark kann vom Laufzeitsystem gestartet werden
(zu Thread konvertiert)


\end{slide}


\begin{slide}{Funktionales und paralleles Programmieren}

Pro:
\begin{itemize}
\item leichte Parallelisierbarkeit für deklarativen Code
\item deklaratives Modell für imperativen Code
  (MVar, STM)
\end{itemize}

Con:
\begin{itemize}
\item lazy evaluation
\item garbage collection
\end{itemize}

aber:
\begin{itemize}
\item lazy evaluation ist selbst eine Form der
  Nebenläufigkeit (vgl. Iteratoren in OO)
\item Nebenläufige garbage-collection wollen 
  viele andere auch
\end{itemize}

\end{slide}
