Haskell.tex 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. \chapter{Haskell}
  2. \index{Haskell|(}
  3. Haskell ist eine funktionale Programmiersprache, die von Haskell
  4. Brooks Curry entwickelt wurde und 1990 in Version~1.0 veröffentlicht
  5. wurde.
  6. Wichtige Konzepte sind:
  7. \begin{enumerate}
  8. \item Funktionen höherer Ordnung
  9. \item anonyme Funktionen (sog. Lambda-Funktionen)
  10. \item Pattern Matching
  11. \item Unterversorgung
  12. \item Typinferenz
  13. \end{enumerate}
  14. Haskell kann mit \enquote{Glasgow Haskell Compiler} mittels
  15. \texttt{ghci} interpretiert und mittels
  16. \section{Erste Schritte}
  17. Haskell kann unter \href{http://www.haskell.org/platform/}{\path{www.haskell.org/platform/}}
  18. für alle Plattformen heruntergeladen werden. Unter Debian-Systemen
  19. ist das Paket \texttt{ghc} bzw. \texttt{haskell-platform} relevant.
  20. \section{Typen}
  21. Siehe \cref{fig:haskell-type-hierarchy}:
  22. \begin{figure}[htp]
  23. \centering
  24. \resizebox{0.9\linewidth}{!}{\input{figures/haskell-type-classes.tex}}
  25. \caption{Hierarchie der Haskell Standardklassen}
  26. \label{fig:haskell-type-hierarchy}
  27. \end{figure}
  28. \section{Syntax}
  29. \subsection{Klammern}
  30. Haskell verzichtet an vielen Stellen auf Klammern. So werden im
  31. Folgenden die Funktionen $f(x) := \frac{\sin x}{x}$ und $g(x) := x \cdot f(x^2)$
  32. definiert:
  33. \inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/einfaches-beispiel-klammern.hs}
  34. \subsection{if / else}
  35. Das folgende Beispiel definiert den Binomialkoeffizienten
  36. \[\binom{n}{k} := \begin{cases}
  37. 1 &\text{falls } k=0 \lor k = n\\
  38. \binom{n-1}{k-1}+\binom{n-1}{k} &\text{sonst}
  39. \end{cases}\]
  40. für $n,k \geq 0$:
  41. \inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/binomialkoeffizient.hs}
  42. \inputminted[numbersep=5pt, tabsize=4]{bash}{scripts/haskell/compile-binom.sh}
  43. \todo[inline]{Guards}
  44. \subsection{Rekursion}
  45. Die Fakultätsfunktion wurde wie folgt implementiert:
  46. \[fak(n) := \begin{cases}
  47. 1 &\text{falls } n=0\\
  48. n \cdot fak(n) &\text{sonst}
  49. \end{cases}\]
  50. \inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/fakultaet.hs}
  51. Diese Implementierung benötigt $\mathcal{O}(n)$ rekursive Aufrufe und
  52. hat einen Speicherverbrauch von $\mathcal{O}(n)$. Durch einen
  53. \textbf{Akkumulator}\xindex{Akkumulator} kann dies verhindert werden:
  54. \inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/fakultaet-akkumulator.hs}
  55. \section{Beispiele}
  56. \subsection{Hello World}
  57. Speichere folgenden Quelltext als \texttt{hello-world.hs}:
  58. \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=hello-world.hs]{haskell}{scripts/haskell/hello-world.hs}
  59. Kompiliere ihn mit \texttt{ghc -o hello hello-world.hs}. Es wird eine
  60. ausführbare Datei erzeugt.
  61. \subsection{Fibonacci}
  62. \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=fibonacci.hs]{haskell}{scripts/haskell/fibonacci.hs}
  63. \subsection{Quicksort}
  64. \section{Weitere Informationen}
  65. \begin{itemize}
  66. \item \href{http://www.haskell.org/hoogle/}{\path{haskell.org/hoogle}}: Suchmaschine für das Haskell-Manual
  67. \item \href{http://wiki.ubuntuusers.de/Haskell}{\path{wiki.ubuntuusers.de/Haskell}}: Hinweise zur Installation von Haskell unter Ubuntu
  68. \end{itemize}
  69. \index{Haskell|)}