2
0
Fork 0
mirror of https://github.com/MartinThoma/LaTeX-examples.git synced 2025-04-25 06:18:05 +02:00
LaTeX-examples/documents/Programmierparadigmen/Haskell.tex
2014-02-02 17:48:55 +01:00

86 lines
3 KiB
TeX

\chapter{Haskell}
\index{Haskell|(}
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.
\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}
\section{Syntax}
\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}
Das folgende Beispiel definiert den Binomialkoeffizienten (vgl. \cref{bsp:binomialkoeffizient})
\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}
\subsection{Listen}
\todo[inline]{Cons-Operator, Unendliche Listen}
\section{Beispiele}
\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}
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=fibonacci.hs]{haskell}{scripts/haskell/fibonacci.hs}
\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}
\index{Haskell|)}