\begin{slide}{Typprüfung/Inferenz}
Begriffe:
  \begin{itemize}
  \item Prüfung: Programmierer deklariert, Compiler prüft
  \item Inferenz: Compiler ergänzt Deklaration (C\#: var, Haskell: let)
  \end{itemize}
Aufgabe: vlg. in Java: Konstruktor/Fabrikmethode

Komplexität:
  \begin{itemize}
  \item einfache Typen (System F1): polynomiell
    (Wort- bzw. Baumautomaten)
  \item generische Typen (Variablen über Typen, System F2): exponentiell
  \item höhere Variablen (System F): unentscheidbar
  \end{itemize}
Siehe Beispiele Java, C\#, Haskell

\end{slide}

\begin{slide}{Typprüfung/Inferenz (Beispiel)}


\begin{verbatim}
next :: Integer -> Integer
next x = x + 1

twice :: (a -> a) -> (a -> a)
twice f x = f (f x)

main = print $ twice twice twice twice next 0
\end{verbatim}
Fragen:
\begin{itemize}
\item Welcher Wert wird ausgegeben?
\item Welchen Typ hat das linke \verb|twice|?
\item Wie sieht entsprechendes Programm in Java aus?
  (Hinweis: verwende Funktionsobjekte)
\begin{verbatim}
interface F<A,B> { B apply(A x); }
\end{verbatim}
\item Wie in C\#?
\item Welche für Java 7 angekündigten Neuerungen könnten helfen?
\end{itemize}

  
\end{slide}
