浏览代码

Haskell Type hierarchy

Martin Thoma 11 年之前
父节点
当前提交
e7e4f64df5

+ 1 - 0
documents/Programmierparadigmen/Arbeitszeit.md

@@ -6,3 +6,4 @@ in dem Erstellen dieses Skripts steckt:
 |01.02.2014 | 13:30 - 13:45 | Thoma | Initialisierung; Grobe Struktur
 |01.02.2014 | 13:30 - 13:45 | Thoma | Initialisierung; Grobe Struktur
 |01.02.2014 | 14:00 - 14:45 | Thoma | ASCII-Tabelle in C angefangen; Kapitel "Programmiersprachen" hinzugefügt; erste Definitionen
 |01.02.2014 | 14:00 - 14:45 | Thoma | ASCII-Tabelle in C angefangen; Kapitel "Programmiersprachen" hinzugefügt; erste Definitionen
 |01.02.2014 | 14:45 - 15:30 | Thoma | Haskell angefangen
 |01.02.2014 | 14:45 - 15:30 | Thoma | Haskell angefangen
+|01.02.2014 | 11:15 - 11:45 | Thoma | Haskell Class Hierachy

+ 10 - 0
documents/Programmierparadigmen/Haskell.tex

@@ -21,6 +21,16 @@ Haskell kann unter \href{http://www.haskell.org/platform/}{\path{www.haskell.org
 für alle Plattformen heruntergeladen werden. Unter Debian-Systemen
 für alle Plattformen heruntergeladen werden. Unter Debian-Systemen
 ist das Paket \texttt{ghc} bzw. \texttt{haskell-platform} relevant.
 ist das Paket \texttt{ghc} bzw. \texttt{haskell-platform} relevant.
 
 
+\section{Typen}
+Siehe \cref{fig:haskell-type-hierarchy}:
+
+\begin{figure}[htp]
+    \centering
+    \resizebox{0.9\linewidth}{!}{\input{figures/haskell-type-classes.tex}}
+    \caption{Hierarchie der Haskell Standardklassen}
+    \label{fig:haskell-type-hierarchy}
+\end{figure}
+
 \section{Syntax}
 \section{Syntax}
 \subsection{Klammern}
 \subsection{Klammern}
 Haskell verzichtet an vielen Stellen auf Klammern. So werden im
 Haskell verzichtet an vielen Stellen auf Klammern. So werden im

二进制
documents/Programmierparadigmen/Programmierparadigmen.pdf


+ 15 - 0
documents/Programmierparadigmen/Vorwort.tex

@@ -5,6 +5,18 @@ in der Klausur als Nachschlagewerk zu dienen; es soll jedoch auch
 vorher schon für die Vorbereitung genutzt werden können und nach
 vorher schon für die Vorbereitung genutzt werden können und nach
 der Klausur als Nachschlagewerk dienen.
 der Klausur als Nachschlagewerk dienen.
 
 
+Ein Link auf das Skript ist unter \href{http://martin-thoma.com/programmierparadigmen-klausur/}{\path{martin-thoma.com/programmierparadigmen-klausur/}}
+zu finden.
+
+\section*{Anregungen, Verbesserungsvorschläge, Ergänzungen}
+Noch ist das Skript im Aufbau. Es gibt viele Baustellen und es ist
+fraglich, ob ich bis zur Klausur alles in guter Qualität bereitstellen
+kann. Daher freue ich mich über jeden Verbesserungsvorschlag.
+
+Anregungen, Verbesserungsvorschläge und Ergänzungen können per
+Pull-Request gemacht werden oder mir per Email an info@martin-thoma.de
+geschickt werden.
+
 \section*{Was ist Programmierparadigmen?}
 \section*{Was ist Programmierparadigmen?}
 
 
 TODO
 TODO
@@ -13,3 +25,6 @@ TODO
 Grundlegende Kenntnisse vom Programmieren, insbesondere mit Java,
 Grundlegende Kenntnisse vom Programmieren, insbesondere mit Java,
 wie sie am KIT in \enquote{Programmieren} vermittelt werden, werden
 wie sie am KIT in \enquote{Programmieren} vermittelt werden, werden
 vorausgesetzt.
 vorausgesetzt.
+
+Die Unifikation wird wohl auch in \enquote{Formale Systeme}
+erklärt; das könnte also hier von Vorteil sein.

+ 36 - 0
documents/Programmierparadigmen/figures/haskell-type-classes.tex

@@ -0,0 +1,36 @@
+\begin{tikzpicture}
+    \tikzstyle{node}=[ellipse,thick,fill=white,draw=black,inner sep=0pt,text width=3cm,align=center]
+    \tikzstyle{edge}=[->, ultra thick]
+    \matrix[row sep=0.5cm,column sep=0.5cm] {
+    \node[node] (Eq)         {\textbf{Eq}\\All except IO, (->)};   &
+    \node[node] (Show)       {\textbf{Show}\\All except IO, (->)}; &
+    \node[node] (Read)       {\textbf{Read}\\All except IO, (->)}; \\
+    \node[node] (Ord)        {\textbf{Ord}\\All except IO, (->), IOError};   &
+    \node[node] (Num)        {\textbf{Num}\\Int, Integer, Float, Double}; &
+    \node[node] (Bounded)    {\textbf{Bounded}\\Int, Char, Bool, (), Ordering, tuples}; \\
+    \node[node] (Enum)       {\textbf{Enum}\\{\small (), Bool, Char, Ordering, Int, Integer, Float, Double}};   &
+    \node[node] (Real)       {\textbf{Real}\\Int, Integer, Float, Double}; &
+    \node[node] (Fractional) {\textbf{Fractional}\\Float, Double}; \\
+    \node[node] (Integral)   {\textbf{Integral}\\Int, Integer};   &
+    \node[node] (RealFrac)   {\textbf{RealFrac}\\Float, Double}; &
+    \node[node] (Floating)   {\textbf{Floating}\\Float, Double}; \\
+    \node[node] (Monad)      {\textbf{Monad}\\IO, (), Maybe};   &
+    \node[node] (RealFloat)  {\textbf{RealFloat}\\Float, Double}; &
+     \\
+    \node[node] (MonadPlus)  {\textbf{MonadPlus}\\IO, (), Maybe};   &
+    \node[node] (Functor)    {\textbf{Functor}\\IO, (), Maybe}; &
+     \\
+    }; 
+    \draw[edge] (Eq) -- (Ord);
+    \draw[edge] (Eq) -- (Num);
+    \draw[edge] (Show) -- (Num);
+    \draw[edge] (Ord) -- (Real);
+    \draw[edge] (Num) -- (Real);
+    \draw[edge] (Num) -- (Fractional);
+    \draw[edge] (Enum) -- (Integral);
+    \draw[edge] (Real) -- (Integral);
+    \draw[edge] (Real) -- (RealFrac);
+    \draw[edge] (Floating) -- (RealFloat);
+    \draw[edge] (RealFrac) -- (RealFloat);
+    \draw[edge] (Monad) -- (MonadPlus);
+\end{tikzpicture}

+ 31 - 0
tikz/haskell-type-classes/Makefile

@@ -0,0 +1,31 @@
+SOURCE  = haskell-type-classes
+DELAY   = 80
+DENSITY = 300
+WIDTH   = 512
+
+make:
+	pdflatex $(SOURCE).tex -output-format=pdf
+	make clean
+
+clean:
+	rm -rf  $(TARGET) *.class *.html *.log *.aux *.data *.gnuplot
+
+gif:
+	pdfcrop $(SOURCE).pdf
+	convert -verbose -delay $(DELAY) -loop 0 -density $(DENSITY) $(SOURCE)-crop.pdf $(SOURCE).gif
+	make clean
+
+png:
+	make
+	make svg
+	inkscape $(SOURCE).svg -w $(WIDTH) --export-png=$(SOURCE).png
+
+transparentGif:
+	convert $(SOURCE).pdf -transparent white result.gif
+	make clean
+
+svg:
+	#inkscape $(SOURCE).pdf --export-plain-svg=$(SOURCE).svg
+	pdf2svg $(SOURCE).pdf $(SOURCE).svg
+	# Necessary, as pdf2svg does not always create valid svgs:
+	inkscape $(SOURCE).svg --export-plain-svg=$(SOURCE).svg

+ 3 - 0
tikz/haskell-type-classes/Readme.md

@@ -0,0 +1,3 @@
+Compiled example
+----------------
+![Example](geometry-1.png)

+ 42 - 0
tikz/haskell-type-classes/haskell-type-classes.tex

@@ -0,0 +1,42 @@
+\documentclass[varwidth=false, border=2pt]{standalone}
+\usepackage{tikz}
+\usetikzlibrary{shapes}
+
+\begin{document}
+\begin{tikzpicture}
+    \tikzstyle{node}=[ellipse,thick,fill=white,draw=black,inner sep=0pt,text width=3cm,align=center]
+    \tikzstyle{edge}=[->, ultra thick]
+    \matrix[row sep=0.5cm,column sep=0.5cm] {
+    \node[node] (Eq)         {\textbf{Eq}\\All except IO, (->)};   &
+    \node[node] (Show)       {\textbf{Show}\\All except IO, (->)}; &
+    \node[node] (Read)       {\textbf{Read}\\All except IO, (->)}; \\
+    \node[node] (Ord)        {\textbf{Ord}\\All except IO, (->), IOError};   &
+    \node[node] (Num)        {\textbf{Num}\\Int, Integer, Float, Double}; &
+    \node[node] (Bounded)    {\textbf{Bounded}\\Int, Char, Bool, (), Ordering, tuples}; \\
+    \node[node] (Enum)       {\textbf{Enum}\\{\small (), Bool, Char, Ordering, Int, Integer, Float, Double}};   &
+    \node[node] (Real)       {\textbf{Real}\\Int, Integer, Float, Double}; &
+    \node[node] (Fractional) {\textbf{Fractional}\\Float, Double}; \\
+    \node[node] (Integral)   {\textbf{Integral}\\Int, Integer};   &
+    \node[node] (RealFrac)   {\textbf{RealFrac}\\Float, Double}; &
+    \node[node] (Floating)   {\textbf{Floating}\\Float, Double}; \\
+    \node[node] (Monad)      {\textbf{Monad}\\IO, (), Maybe};   &
+    \node[node] (RealFloat)  {\textbf{RealFloat}\\Float, Double}; &
+     \\
+    \node[node] (MonadPlus)  {\textbf{MonadPlus}\\IO, (), Maybe};   &
+    \node[node] (Functor)    {\textbf{Functor}\\IO, (), Maybe}; &
+     \\
+    }; 
+    \draw[edge] (Eq) -- (Ord);
+    \draw[edge] (Eq) -- (Num);
+    \draw[edge] (Show) -- (Num);
+    \draw[edge] (Ord) -- (Real);
+    \draw[edge] (Num) -- (Real);
+    \draw[edge] (Num) -- (Fractional);
+    \draw[edge] (Enum) -- (Integral);
+    \draw[edge] (Real) -- (Integral);
+    \draw[edge] (Real) -- (RealFrac);
+    \draw[edge] (Floating) -- (RealFloat);
+    \draw[edge] (RealFrac) -- (RealFloat);
+    \draw[edge] (Monad) -- (MonadPlus);
+\end{tikzpicture}
+\end{document}