\begin{slide}{Datengesteuerte Schleifen}
Idee: führe für jeden Konstruktor eines algebraischen
Datentyps (Liste, Baum) eine Rechnung/Aktion aus.

\verb|foreach, Parallel.Foreach,...|

\end{slide}

\begin{slide}{Zustandsgesteuerte Schleifen}

So:
\begin{verbatim}
interface Iterator<T> {
  boolean hasNext(); T next ();  }
interface Iterable<T> { 
   Iterator<T> iterator(); }
for (T x : ...) { ... }
\end{verbatim}
  
Oder so:
\begin{verbatim}
public interface IEnumerator<T> : IEnumerator {
  bool MoveNext(); T Current { get; } }
interface IEnumerable<out T> : IEnumerable {
   IEnumerator<T> GetEnumerator() }
foreach (T x in ...) { ... }
\end{verbatim}
  
(sieben Unterschiede \dots)
\end{slide}

\begin{slide}{Implizite Iteratoren in C\#}

\begin{verbatim}
using System.Collections.Generic;
public class it {
    public static IEnumerable<int> Data () {
        yield return 3;
        yield return 1;
        yield return 4;
    }
    public static void Main () {
        foreach (int i in Data()) {
            System.Console.WriteLine (i);
}   }   }
\end{verbatim}

\end{slide}
