|
@@ -1,3 +1,4 @@
|
|
|
+%!TEX root = Programmierparadigmen.tex
|
|
|
\chapter{Haskell}
|
|
|
\index{Haskell|(}
|
|
|
Haskell ist eine funktionale Programmiersprache, die von Haskell
|
|
@@ -122,6 +123,28 @@ in etwa folgendem Haskell-Code:
|
|
|
\end{itemize}
|
|
|
|
|
|
\section{Typen}
|
|
|
+\subsection{Standard-Typen}
|
|
|
+Haskell kennt einige Basis-Typen:
|
|
|
+\begin{itemize}
|
|
|
+ \item \textbf{Int}: Ganze Zahlen. Der Zahlenbereich kann je nach Implementierung variieren,
|
|
|
+ aber der Haskell-Standart garantiert, dass das Intervall
|
|
|
+ $[-2^{29}, 2^{29}-1]$ abgedeckt wird.
|
|
|
+ \item \textbf{Integer}: beliebig große ganze Zahlen
|
|
|
+ \item \textbf{Float}: Fließkommazahlen
|
|
|
+ \item \textbf{Double}: Fließkommazahlen mit doppelter Präzision
|
|
|
+ \item \textbf{Bool}: Wahrheitswerte
|
|
|
+ \item \textbf{Char}: Unicode-Zeichen
|
|
|
+\end{itemize}
|
|
|
+
|
|
|
+Des weiteren gibt es einige strukturierte Typen:
|
|
|
+\begin{itemize}
|
|
|
+ \item Listen: z.~B. $[1,2,3]$
|
|
|
+ \item Tupel: z.~B. $(1,'a',2)$
|
|
|
+ \item Brüche (Fractional, RealFrac)
|
|
|
+ \item Summen-Typen: Typen mit mehreren möglichen Repräsentationen
|
|
|
+\end{itemize}
|
|
|
+
|
|
|
+\subsection{Typinferenz}
|
|
|
In Haskell werden Typen aus den Operationen geschlossfolgert. Dieses
|
|
|
Schlussfolgern der Typen, die nicht explizit angegeben werden müssen,
|
|
|
nennt man \textbf{Typinferent}\xindex{Typinferenz}.
|
|
@@ -139,6 +162,18 @@ Ein paar Beispiele zur Typinferenz:
|
|
|
\label{fig:haskell-type-hierarchy}
|
|
|
\end{figure}
|
|
|
|
|
|
+\section{Lazy Evaluation}\xindex{Lazy Evaluation}
|
|
|
+Haskell wertet Ausdrücke nur aus, wenn es nötig ist.
|
|
|
+
|
|
|
+\begin{beispiel}[Lazy Evaluation]
|
|
|
+ Obwohl der folgende Ausdruck einen Teilausdruck hat, der einen Fehler zurückgeben
|
|
|
+ würde, kann er aufgrund der Lazy Evaluation zu 2 evaluiert werden:
|
|
|
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=lazy-evaluation.hs]{haskell}{scripts/haskell/lazy-evaluation.hs}
|
|
|
+\end{beispiel}
|
|
|
+
|
|
|
+Ein spezialfall der Lazy-Evaluation ist die sog. \textit{Kurzschlussauswertung}.\xindex{Kurzschlussauswertung}\xindex{Short-circuit evaluation}
|
|
|
+Das bezeichnet die Lazy-Evaluation von booleschen Ausdrücken.
|
|
|
+
|
|
|
\section{Beispiele}
|
|
|
\subsection{Quicksort}
|
|
|
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=qsort.hs]{haskell}{scripts/haskell/qsort.hs}
|
|
@@ -163,7 +198,8 @@ sich das ganze sogar noch kürzer schreiben:
|
|
|
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=fibonacci-pattern-matching.hs]{haskell}{scripts/haskell/fibonacci-pattern-matching.hs}
|
|
|
|
|
|
\subsection{Quicksort}
|
|
|
-\subsection{Funktionen höherer Ordnung}
|
|
|
+\subsection{Funktionen höherer Ordnung}\xindex{Folds}\xindex{foldl}\xindex{foldr}\label{bsp:foldl-und-foldr}
|
|
|
+\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=folds.hs]{haskell}{scripts/haskell/folds.hs}
|
|
|
|
|
|
|
|
|
\section{Weitere Informationen}
|