\begin{slide}{Algebraische Datentypen und Pattern Matching}

ein Datentyp mit zwei Konstruktoren:
\begin{verbatim}
data List a 
   = Nil             -- nullstellig 
   | Cons a (List a) -- zweistellig
\end{verbatim}
Programm mit Pattern Matching:
\begin{verbatim}
length :: List a -> Int
length xs = case xs of
    Nil       -> 0
    Cons x ys -> 1 + length ys
\end{verbatim}
beachte: Datentyp rekursiv 
$\Rightarrow$ Programm rekursiv

\begin{verbatim}
append :: List a -> List a -> List a 
\end{verbatim}

\end{slide}

\begin{slide}{Alg. Datentypen (Beispiele)}

\begin{verbatim}
data Bool = False | True
data Maybe a = Nothing | Just a
\end{verbatim}
  
\begin{verbatim}
data Tree a = 
    Leaf | Branch ( Tree a ) a ( Tree a)
\end{verbatim}
Ü: inorder, preorder, leaves, depth

Ü: Schlüssel in Blättern

\begin{verbatim}
data N = Z | S N  
\end{verbatim}
Ü: Rechenoperationen

\end{slide}
