2014-02-01 13:46:33 +01:00
|
|
|
\chapter{Haskell}
|
|
|
|
\index{Haskell|(}
|
2014-02-01 15:32:13 +01:00
|
|
|
Haskell ist eine funktionale Programmiersprache, die von Haskell
|
|
|
|
Brooks Curry entwickelt wurde und 1990 in Version~1.0 veröffentlicht
|
|
|
|
wurde.
|
|
|
|
|
|
|
|
Wichtige Konzepte sind:
|
|
|
|
\begin{enumerate}
|
|
|
|
\item Funktionen höherer Ordnung
|
|
|
|
\item anonyme Funktionen (sog. Lambda-Funktionen)
|
|
|
|
\item Pattern Matching
|
|
|
|
\item Unterversorgung
|
|
|
|
\item Typinferenz
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
Haskell kann mit \enquote{Glasgow Haskell Compiler} mittels
|
|
|
|
\texttt{ghci} interpretiert und mittels
|
|
|
|
|
|
|
|
\section{Erste Schritte}
|
|
|
|
Haskell kann unter \href{http://www.haskell.org/platform/}{\path{www.haskell.org/platform/}}
|
|
|
|
für alle Plattformen heruntergeladen werden. Unter Debian-Systemen
|
|
|
|
ist das Paket \texttt{ghc} bzw. \texttt{haskell-platform} relevant.
|
2014-02-01 14:39:16 +01:00
|
|
|
|
2014-02-02 11:59:07 +01:00
|
|
|
\section{Typen}
|
|
|
|
Siehe \cref{fig:haskell-type-hierarchy}:
|
|
|
|
|
|
|
|
\begin{figure}[htp]
|
|
|
|
\centering
|
|
|
|
\resizebox{0.9\linewidth}{!}{\input{figures/haskell-type-classes.tex}}
|
|
|
|
\caption{Hierarchie der Haskell Standardklassen}
|
|
|
|
\label{fig:haskell-type-hierarchy}
|
|
|
|
\end{figure}
|
|
|
|
|
2014-02-01 13:46:33 +01:00
|
|
|
\section{Syntax}
|
2014-02-01 15:32:13 +01:00
|
|
|
\subsection{Klammern}
|
|
|
|
Haskell verzichtet an vielen Stellen auf Klammern. So werden im
|
|
|
|
Folgenden die Funktionen $f(x) := \frac{\sin x}{x}$ und $g(x) := x \cdot f(x^2)$
|
|
|
|
definiert:
|
|
|
|
|
|
|
|
\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/einfaches-beispiel-klammern.hs}
|
|
|
|
|
|
|
|
\subsection{if / else}
|
2014-02-02 17:48:55 +01:00
|
|
|
Das folgende Beispiel definiert den Binomialkoeffizienten (vgl. \cref{bsp:binomialkoeffizient})
|
2014-02-01 15:32:13 +01:00
|
|
|
|
|
|
|
\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/binomialkoeffizient.hs}
|
|
|
|
\inputminted[numbersep=5pt, tabsize=4]{bash}{scripts/haskell/compile-binom.sh}
|
|
|
|
|
|
|
|
\todo[inline]{Guards}
|
|
|
|
|
|
|
|
\subsection{Rekursion}
|
|
|
|
Die Fakultätsfunktion wurde wie folgt implementiert:
|
|
|
|
\[fak(n) := \begin{cases}
|
|
|
|
1 &\text{falls } n=0\\
|
|
|
|
n \cdot fak(n) &\text{sonst}
|
|
|
|
\end{cases}\]
|
|
|
|
\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/fakultaet.hs}
|
|
|
|
|
|
|
|
Diese Implementierung benötigt $\mathcal{O}(n)$ rekursive Aufrufe und
|
|
|
|
hat einen Speicherverbrauch von $\mathcal{O}(n)$. Durch einen
|
|
|
|
\textbf{Akkumulator}\xindex{Akkumulator} kann dies verhindert werden:
|
|
|
|
\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/fakultaet-akkumulator.hs}
|
|
|
|
|
2014-02-02 17:48:55 +01:00
|
|
|
\subsection{Listen}
|
|
|
|
\todo[inline]{Cons-Operator, Unendliche Listen}
|
|
|
|
|
2014-02-02 18:01:02 +01:00
|
|
|
\subsubsection{Beispiel in der interaktiven Konsole}
|
|
|
|
\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/listenoperationen.sh}
|
|
|
|
|
2014-02-01 13:46:33 +01:00
|
|
|
\section{Beispiele}
|
2014-02-01 15:32:13 +01:00
|
|
|
\subsection{Hello World}
|
|
|
|
Speichere folgenden Quelltext als \texttt{hello-world.hs}:
|
|
|
|
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=hello-world.hs]{haskell}{scripts/haskell/hello-world.hs}
|
|
|
|
|
|
|
|
Kompiliere ihn mit \texttt{ghc -o hello hello-world.hs}. Es wird eine
|
|
|
|
ausführbare Datei erzeugt.
|
|
|
|
|
|
|
|
\subsection{Fibonacci}
|
2014-02-01 13:46:33 +01:00
|
|
|
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=fibonacci.hs]{haskell}{scripts/haskell/fibonacci.hs}
|
|
|
|
|
2014-02-01 15:32:13 +01:00
|
|
|
\subsection{Quicksort}
|
|
|
|
|
|
|
|
\section{Weitere Informationen}
|
|
|
|
\begin{itemize}
|
|
|
|
\item \href{http://www.haskell.org/hoogle/}{\path{haskell.org/hoogle}}: Suchmaschine für das Haskell-Manual
|
|
|
|
\item \href{http://wiki.ubuntuusers.de/Haskell}{\path{wiki.ubuntuusers.de/Haskell}}: Hinweise zur Installation von Haskell unter Ubuntu
|
|
|
|
\end{itemize}
|
|
|
|
|
2014-02-01 13:46:33 +01:00
|
|
|
\index{Haskell|)}
|
|
|
|
|