\begin{slide}{Linq und Monaden: Notation}

\begin{minipage}{0.5\textwidth}
Haskell:
\begin{verbatim}
test :: [ Integer ]
test = do 
   x <- [ 1 .. 5 ]
   guard $ odd x
   y <- [ 1 .. x ]
   return $ x * y
\end{verbatim}
\end{minipage}%
\begin{minipage}{0.5\textwidth}
C\# (LINQ):
\begin{verbatim}
IEnumerable<int> test = 
    from x in Enumerable.Range(1,5)
    where 0 != x % 2
    from y in Enumerable.Range(1,x)
    select x * y;
\end{verbatim}
\end{minipage}

Linq: \url{http://msdn.microsoft.com/en-us/library/bb397676.aspx}

Beispiele: \url{http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx}
(Vorsicht: inzwischen einige Methoden umbenannt)

\end{slide}

\begin{slide}{Linq und Monaden: Semantik}

\begin{verbatim}
class Monad m where
    (>>=) :: m a -> (a -> m b) -> m b

[1 .. 5] >>= \ x -> [ 1 .. x ]
\end{verbatim}
  
\begin{verbatim}
using System.Linq;
public static IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TResult>> selector
)

Enumerable.Range(1,5).SelectMany(x => Enumerable.Range(1,x)
\end{verbatim}
  
\end{slide}

\begin{slide}{Linq und Haskell: gut zu wissen}

\renewcommand{\arraystretch}{1.5}
\begin{tabular}{l|l}
Haskell & Linq \\ \hline 
\verb|[a]| & \verb|IEnumerable<a>| \\
map und bind (\verb|>>=|) & Select und SelectMany \\
take und drop & Take und Skip \\
(\verb|++|) und reverse 
& Concat und Reverse \\
fold & Aggregate \\
\verb|[x .. x+n-1]| & \verb|Enumerable.Range(x,n)| \\
\verb|forM_ xs print| & 
\shortstack{xs.ToList().ForEach(x $=>$ \\
Console.WriteLine(x)) } \\
\end{tabular}

\end{slide}

\begin{slide}{Linq: Beispiel}

\begin{verbatim}
Random random = ... ; int block = ... ;
IEnumerable<Pair<V,G>> store =
    from Pair<V,G> p in this.pool
    group p by p.first into g
    orderby g.Key
    from q in g.Distinct()
               .OrderBy(p => random.Next())
               .Take(block)
    select q;
this.pool = store.Take(this.size).ToList();
\end{verbatim}
  
\end{slide}
