diff --git a/documents/Programmierparadigmen/Haskell.tex b/documents/Programmierparadigmen/Haskell.tex index 63c5974..26fedec 100644 --- a/documents/Programmierparadigmen/Haskell.tex +++ b/documents/Programmierparadigmen/Haskell.tex @@ -162,6 +162,17 @@ Ein paar Beispiele zur Typinferenz: \label{fig:haskell-type-hierarchy} \end{figure} +\subsection{type} +Mit \texttt{type} können Typsynonyme erstellt werden: + +\inputminted[linenos, numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/alt-types.hs} + +\subsection{data} +Mit dem Schlüsselwort \texttt{data} können algebraische Datentypen\xindex{Datentyp!algebraischer} +erzeugt werden: + + + \section{Lazy Evaluation}\xindex{Lazy Evaluation} Haskell wertet Ausdrücke nur aus, wenn es nötig ist. diff --git a/documents/Programmierparadigmen/Programmierparadigmen.pdf b/documents/Programmierparadigmen/Programmierparadigmen.pdf index edb7524..ab6dc21 100644 Binary files a/documents/Programmierparadigmen/Programmierparadigmen.pdf and b/documents/Programmierparadigmen/Programmierparadigmen.pdf differ diff --git a/documents/Programmierparadigmen/Programmierparadigmen.tex b/documents/Programmierparadigmen/Programmierparadigmen.tex index b057038..9d6019a 100644 --- a/documents/Programmierparadigmen/Programmierparadigmen.tex +++ b/documents/Programmierparadigmen/Programmierparadigmen.tex @@ -93,6 +93,7 @@ \input{Programmiersprachen} \input{Programmiertechniken} \input{Logik} +\input{lambda} \input{Haskell} \input{Prolog} \input{Scala} diff --git a/documents/Programmierparadigmen/lambda.tex b/documents/Programmierparadigmen/lambda.tex new file mode 100644 index 0000000..a2b5584 --- /dev/null +++ b/documents/Programmierparadigmen/lambda.tex @@ -0,0 +1,87 @@ +%!TEX root = Programmierparadigmen.tex +\chapter{$\lambda$-Kalkül} +Der Lambda-Kalkül ist eine formale Sprache. +In diesem Kalkül gibt es drei Arten von Termen $T$: + +\begin{itemize} + \item Variablen: $x$ + \item Applikationen: $(T T)$ + \item Lambda: $\lambda x. T$ +\end{itemize} + +Es ist zu beachten, dass Funktionsapplikation linksassoziativ ist. Es gilt also: + +\[a~b~c~d = ((a~b)~c)~d\] + +\begin{definition}[Freie Variable] + TODO +\end{definition} + +\begin{definition}[Gebundene Variable] + Eine Variable heißt gebunden, wenn sie nicht frei ist. +\end{definition} + +\section{Reduktionen} +\begin{definition}[$\alpha$-Äquivalenz] + Zwei Terme $T_1, T_2$ heißen $\alpha$-Äquivalent, wenn $T_1$ durch + konsistente Umbenennung in $T_2$ überführt werden kann. + + Man schreibt dann: $T_1 \overset{\alpha}{=} T_2$. +\end{definition} + +\begin{beispiel}[$\alpha$-Äquivalenz] + \begin{align*} + \lambda x.x &\overset{\alpha}{=} \lambda y. y\\ + \lambda x. x x &\overset{\alpha}{=} \lambda y. y y\\ + \lambda x. (\lambda y. z (\lambda x. z y) y) &\overset{\alpha}{=} + \lambda a. (\lambda x. z (\lambda c. z x) x) + \end{align*} +\end{beispiel} + +\begin{definition}[$\beta$-Äquivalenz] + TODO +\end{definition} + +\begin{beispiel}[$\beta$-Äquivalenz] + TODO +\end{beispiel} + +\begin{definition}[$\eta$-Äquivalenz] + Zwei Terme $\lambda x. f~x$ und $f$ heißen $\eta$-Äquivalent, wenn + $x$ nicht freie Variable von $f$ ist. +\end{definition} + +\begin{beispiel}[$\eta$-Äquivalenz] + TODO +\end{beispiel} + +\section{Auswertungsstrategien} +\begin{definition}[Normalenreihenfolge]\xindex{Normalenreihenfolge}% + In der Normalenreihenfolge-Auswertungsstrategie wird der linkeste äußerste + Redex ausgewertet. +\end{definition} + +\begin{definition}[Call-By-Name]\xindex{Call-By-Name}% + In der Call-By-Name Auswertungsreihenfolge wird der linkeste äußerste Redex + reduziert, der nicht von einem $\lambda$ umgeben ist. +\end{definition} + +Die Call-By-Name Auswertung wird in Funktionen verwendet. + +\begin{definition}[Call-By-Value]\xindex{Call-By-Value}% + In der Call-By-Value Auswertung wird der linkeste Redex reduziert, der + nicht von einem $\lambda$ umgeben ist und dessen Argument ein Wert ist. +\end{definition} + +Die Call-By-Value Auswertungsreihenfolge wird in C und Java verwendet. +Auch in Haskell werden arithmetische Ausdrücke in der Call-By-Name Auswertungsreihenfolge +reduziert. + +\section{Church-Zahlen} +TODO + +\section{Weiteres} + +\begin{satz}[Satz von Curch-Rosser] + Wenn zwei unterschiedliche Terme $a$ und $b$ äquivalent sind, d.h. mit Reduktionsschritten beliebiger Richtung ineinander transformiert werden können, dann gibt es einen weiteren Term $c$, zu dem sowohl $a$ als auch $b$ reduziert werden können. +\end{satz} \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/haskell/algebraic-datatypes.hs b/documents/Programmierparadigmen/scripts/haskell/algebraic-datatypes.hs new file mode 100644 index 0000000..b9945fe --- /dev/null +++ b/documents/Programmierparadigmen/scripts/haskell/algebraic-datatypes.hs @@ -0,0 +1,6 @@ +data People = Person String Int +jogi :: People +jogi = Person "Joachim Löw" 50 + +isAdult :: People -> Bool +isAdult (Person name age) = (age >= 18) \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/haskell/alt-types.hs b/documents/Programmierparadigmen/scripts/haskell/alt-types.hs new file mode 100644 index 0000000..68fd7f0 --- /dev/null +++ b/documents/Programmierparadigmen/scripts/haskell/alt-types.hs @@ -0,0 +1,4 @@ +type Prename = String +type Age = Double +type Person = (Prename, Age) +type Friends = [Person] \ No newline at end of file