2
0
Fork 0
mirror of https://github.com/MartinThoma/LaTeX-examples.git synced 2025-04-25 14:28:05 +02:00
LaTeX-examples/documents/Programmierparadigmen/Haskell.tex

89 lines
3.1 KiB
TeX
Raw Normal View History

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-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}
Das folgende Beispiel definiert den Binomialkoeffizienten
\[\binom{n}{k} := \begin{cases}
1 &\text{falls } k=0 \lor k = n\\
\binom{n-1}{k-1}+\binom{n-1}{k} &\text{sonst}
\end{cases}\]
für $n,k \geq 0$:
\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-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|)}