mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-25 22:38:04 +02:00
Haskell angefangen
This commit is contained in:
parent
ff14701ccf
commit
3b44772968
14 changed files with 147 additions and 6 deletions
|
@ -1,10 +1,80 @@
|
|||
\chapter{Haskell}
|
||||
\index{Haskell|(}
|
||||
Haskell ist eine funktionale Programmiersprache.
|
||||
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{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}
|
||||
|
||||
\todo[inline]{Endrekursion ... macht für mich unter "Haskell" wenig sinn. Vielleicht einen neuen Abschnitt mit Techniken? Was würde da noch landen?}
|
||||
|
||||
\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|)}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue