1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- \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
- \[\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}
- \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|)}
|