diff --git a/documents/Programmierparadigmen/Haskell.tex b/documents/Programmierparadigmen/Haskell.tex index a0c5523..f7c6ae5 100644 --- a/documents/Programmierparadigmen/Haskell.tex +++ b/documents/Programmierparadigmen/Haskell.tex @@ -133,6 +133,18 @@ in etwa folgendem Haskell-Code: \subsection{Let und where}\xindex{let}\xindex{where}% \inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/let-where-bindung.hs} +\subsection{Funktionskomposition}\xindex{.}\xindex{Funktionskomposition}% +In Haskell funktioniert Funktionskomposition mit einem Punkt: + +\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/function-composition.hs} + +Dabei ergibt \texttt{h (-3)} in der mathematischen Notation +\[(g \circ f) (-3) = f(g(-3)) = f(-4) = 16\] +und \texttt{i (-3)} ergibt +\[(f \circ g) (-3) = g(f(-3)) = g(9) = 8\] +Es ist also anzumerken, dass die Reihenfolge \underline{nicht} der mathematischen +konvention entspricht. + \section{Typen} \subsection{Standard-Typen} Haskell kennt einige Basis-Typen: @@ -245,6 +257,25 @@ wird wie folgt erzeugt: \subsection{Chruch-Zahlen} \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=church.hs]{haskell}{scripts/haskell/church.hs} +\subsection{Trees}\xindex{tree}\xindex{map!tree}% +Einen Binärbaum kann man in Haskell so definieren: + +\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/binary-tree.hs} + +Einen allgemeinen Baum so: + +\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/general-tree.hs} + +Hier ist \texttt{t} der polymorphe Typ des Baumes. \texttt{t} gibt also an welche +Elemente der Baum enthält. + +Man kann auf einem solchen Baum auch eine Variante von \texttt{map} und +\texttt{reduce} definieren, +also eine Funktion \texttt{mapT}, die eine weitere Funktion \texttt{f} auf jeden +Knoten anwendet: + +\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/mapt.hs} + \subsection{Standard Prelude} Hier sind die Definitionen eininger wichtiger Funktionen: \xindex{zipWith}\xindex{zip} diff --git a/documents/Programmierparadigmen/Programmierparadigmen.pdf b/documents/Programmierparadigmen/Programmierparadigmen.pdf index b901704..f096dcb 100644 Binary files a/documents/Programmierparadigmen/Programmierparadigmen.pdf and b/documents/Programmierparadigmen/Programmierparadigmen.pdf differ diff --git a/documents/Programmierparadigmen/Prolog.tex b/documents/Programmierparadigmen/Prolog.tex index 0a6675f..db43893 100644 --- a/documents/Programmierparadigmen/Prolog.tex +++ b/documents/Programmierparadigmen/Prolog.tex @@ -105,7 +105,7 @@ Dieses skript soll man \texttt{swipl -f test.pl} aufrufen. Dann erhält man: \inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/splits.sh} -\subsection{Delete} +\subsection{Delete}\xindex{remove}\xindex{delete}% \inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/delete.pl} \subsection{Zebrarätsel} diff --git a/documents/Programmierparadigmen/scripts/haskell/binary-tree.hs b/documents/Programmierparadigmen/scripts/haskell/binary-tree.hs new file mode 100644 index 0000000..5d45ef6 --- /dev/null +++ b/documents/Programmierparadigmen/scripts/haskell/binary-tree.hs @@ -0,0 +1,2 @@ +data Tree a = Empty | Node a (Tree a) (Tree a) + deriving (Show) \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/haskell/function-composition.hs b/documents/Programmierparadigmen/scripts/haskell/function-composition.hs new file mode 100644 index 0000000..c24fa2e --- /dev/null +++ b/documents/Programmierparadigmen/scripts/haskell/function-composition.hs @@ -0,0 +1,4 @@ +f x = x * x +g x = x - 1 +h = (f . g) +i = (g . f) \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/haskell/general-tree.hs b/documents/Programmierparadigmen/scripts/haskell/general-tree.hs new file mode 100644 index 0000000..d0d1e8b --- /dev/null +++ b/documents/Programmierparadigmen/scripts/haskell/general-tree.hs @@ -0,0 +1 @@ +data Tree t = Node t[Tree t] \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/haskell/mapt.hs b/documents/Programmierparadigmen/scripts/haskell/mapt.hs new file mode 100644 index 0000000..e10ff40 --- /dev/null +++ b/documents/Programmierparadigmen/scripts/haskell/mapt.hs @@ -0,0 +1,5 @@ +mapT :: (t -> s) -> Tree t -> Tree s +mapT f (Node x ts) = Node (f x) (map (mapT f) ts) + +reduceT :: (t -> t -> t) -> Tree t -> t +reduceT f (Node x ts) = foldl f x (map (reduceT f) ts) \ No newline at end of file