Haskell.tex 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 (vgl. \cref{bsp:binomialkoeffizient})
  36. \inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/binomialkoeffizient.hs}
  37. \inputminted[numbersep=5pt, tabsize=4]{bash}{scripts/haskell/compile-binom.sh}
  38. \todo[inline]{Guards}
  39. \subsection{Rekursion}
  40. Die Fakultätsfunktion wurde wie folgt implementiert:
  41. \[fak(n) := \begin{cases}
  42. 1 &\text{falls } n=0\\
  43. n \cdot fak(n) &\text{sonst}
  44. \end{cases}\]
  45. \inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/fakultaet.hs}
  46. Diese Implementierung benötigt $\mathcal{O}(n)$ rekursive Aufrufe und
  47. hat einen Speicherverbrauch von $\mathcal{O}(n)$. Durch einen
  48. \textbf{Akkumulator}\xindex{Akkumulator} kann dies verhindert werden:
  49. \inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/fakultaet-akkumulator.hs}
  50. \subsection{Listen}
  51. \todo[inline]{Cons-Operator, Unendliche Listen}
  52. \section{Beispiele}
  53. \subsection{Hello World}
  54. Speichere folgenden Quelltext als \texttt{hello-world.hs}:
  55. \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=hello-world.hs]{haskell}{scripts/haskell/hello-world.hs}
  56. Kompiliere ihn mit \texttt{ghc -o hello hello-world.hs}. Es wird eine
  57. ausführbare Datei erzeugt.
  58. \subsection{Fibonacci}
  59. \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=fibonacci.hs]{haskell}{scripts/haskell/fibonacci.hs}
  60. \subsection{Quicksort}
  61. \section{Weitere Informationen}
  62. \begin{itemize}
  63. \item \href{http://www.haskell.org/hoogle/}{\path{haskell.org/hoogle}}: Suchmaschine für das Haskell-Manual
  64. \item \href{http://wiki.ubuntuusers.de/Haskell}{\path{wiki.ubuntuusers.de/Haskell}}: Hinweise zur Installation von Haskell unter Ubuntu
  65. \end{itemize}
  66. \index{Haskell|)}