From 69176aef2b0b24a1d63f036083498157667475ea Mon Sep 17 00:00:00 2001
From: Michael Sippel <micha@fragmental.art>
Date: Tue, 24 Sep 2024 11:56:08 +0200
Subject: [PATCH] add summary & traits/wrappers

---
 beamer/lc-beamer/example.tex           | 107 +++++++++++++++++++------
 beamer/lc-beamer/solution-traits.dot   |  15 ++++
 beamer/lc-beamer/solution-traits.png   | Bin 0 -> 9614 bytes
 beamer/lc-beamer/solution-wrappers.dot |  15 ++++
 beamer/lc-beamer/solution-wrappers.png | Bin 0 -> 8738 bytes
 5 files changed, 113 insertions(+), 24 deletions(-)
 create mode 100644 beamer/lc-beamer/solution-traits.dot
 create mode 100644 beamer/lc-beamer/solution-traits.png
 create mode 100644 beamer/lc-beamer/solution-wrappers.dot
 create mode 100644 beamer/lc-beamer/solution-wrappers.png

diff --git a/beamer/lc-beamer/example.tex b/beamer/lc-beamer/example.tex
index f1dfc9c..463277e 100644
--- a/beamer/lc-beamer/example.tex
+++ b/beamer/lc-beamer/example.tex
@@ -255,19 +255,41 @@ image-write "out.png" im3
 
 
 \begin{frame}{Solutions (I): Traits / Typeclasses / Interfaces}
+\centering
+	\includegraphics[width=0.5\textwidth]{solution-traits.png}
+	\vskip1cm
   \begin{itemize}
-	\item todo
+	\item \texttt{impl Angle for Degrees \{ \dots \}}
+	\item \texttt{impl Angle for Turns \{ \dots \}}
+	\item \texttt{impl Angle for Radians \{ \dots \}}
   \end{itemize}
 \end{frame}
 
 
 \begin{frame}{Solutions (II): Wrapper structs / newtype}
+\centering
+	\includegraphics[width=0.5\textwidth]{solution-wrappers.png}
+
+  \vskip1cm
   \begin{itemize}
-	\item todo
+	\item \texttt{struct Degrees\{ value: f32 \}}
+	\item \texttt{struct Turns\{ value: f32 \}}
+	\item \texttt{struct Radians\{ value: f32 \}}
   \end{itemize}
 \end{frame}
 
 
+\begin{frame}{Solutions (II): Wrapper structs / newtype}
+\centering
+	\includegraphics[width=0.5\textwidth]{solution-wrappers.png}
+
+  \vskip1cm
+  \begin{itemize}
+	\item \texttt{struct Degrees<T: \(\mathbb{R}\)>\{ value: T \}}
+	\item \texttt{struct Turns<T: \(\mathbb{R}\)>\{ value: T \}}
+	\item \texttt{struct Radians<T: \(\mathbb{R}\)>\{ value: T \}}
+  \end{itemize}
+\end{frame}
 
 \begin{frame}{Coercions: (In-)Coherence with Transitivity}
   \begin{itemize}
@@ -461,6 +483,22 @@ $$\\$$
 
 
 
+
+\begin{frame}{Typing}
+\begin{definition}[Typing Relation]
+\begin{mathpar}
+	\inferrule[T-App]{
+		\Gamma \vdash \metavariable{f} : \metavariable{\sigma} \typeterminal{\rightarrow} \metavariable{\tau}\\
+		\Gamma \vdash \metavariable{a} : \metavariable{\sigma'}\\
+		\Gamma \vdash \metavariable{\sigma'} \leadsto \metavariable{\sigma}
+	}{
+		\Gamma \vdash (\metavariable{f} \quad \metavariable{a}) : \metavariable{\tau}
+	}
+\end{mathpar}
+\end{definition}
+\end{frame}
+
+
 \begin{frame}{Morphism Graph}
 
 \begin{definition}[Morphism Paths]
@@ -607,24 +645,6 @@ Then ..
 \end{frame}
 
 
-
-
-\begin{frame}{Typing}
-\begin{definition}[Typing Relation]
-\begin{mathpar}
-	\inferrule[T-App]{
-		\Gamma \vdash \metavariable{f} : \metavariable{\sigma} \typeterminal{\rightarrow} \metavariable{\tau}\\
-		\Gamma \vdash \metavariable{a} : \metavariable{\sigma'}\\
-		\Gamma \vdash \metavariable{\sigma'} \leadsto \metavariable{\sigma}
-	}{
-		\Gamma \vdash (\metavariable{f} \quad \metavariable{a}) : \metavariable{\tau}
-	}
-\end{mathpar}
-\end{definition}
-\end{frame}
-
-
-
 \begin{frame}{Translation}
 \begin{definition}[Expression Translation]
 Translates a type-derivation tree into a fully expanded expression
@@ -693,13 +713,52 @@ D :: \Gamma \vdash \metavariable{e} : \metavariable{\tau}\\
 \end{frame}
 
 
-
-
 \begin{frame}[t, fragile]{Summary}
 
-%\begin{tabular*}[h]{p{0.5\textwidth}|p{0.5\textwidth}}
-%\end{tabular*}
+\begin{tabular*}{\textwidth}{p{0.5\textwidth}|p{0.5\textwidth}}
 
+	\textbf{Problem}
+	\small
+	\begin{itemize}
+	\item fixed memory representation derived from type
+		  (loss of low level control)
+				
+	\item weak type interpretations
+		(loss of safety)
+	\end{itemize}
+
+	&
+
+	\textbf{Goal}
+	\small
+	\begin{itemize}
+	\item handle data transformations in type-safe way
+	\item allow low-level optimizations
+	 with strong, unambiguous types
+	\end{itemize}
+
+	\\
+
+	\hline
+
+	\textbf{Ladder-Types}
+	\small
+	\begin{itemize}
+	\item connect low-level representation \&
+		high-level concept via structure of type terms
+	\end{itemize}
+
+	&
+
+	\textbf{Result}
+	\small
+	\begin{itemize}
+	\item extended SystemF with ladder types \& morphisms
+	\item formalized in Coq
+	\item proved basic lemmas about correctness of translation
+	\end{itemize}
+
+\end{tabular*}
 \end{frame}
 
 
diff --git a/beamer/lc-beamer/solution-traits.dot b/beamer/lc-beamer/solution-traits.dot
new file mode 100644
index 0000000..34e9b8d
--- /dev/null
+++ b/beamer/lc-beamer/solution-traits.dot
@@ -0,0 +1,15 @@
+
+digraph SeaOfTypes {
+
+    Degrees [label="Degrees", fontsize=20, shape=plaintext];
+    Turns [label="Turns", fontsize=20, shape=plaintext];
+    Radians [label="Radians", fontsize=20, shape=plaintext];
+    
+    Angle [label="Angle", fontsize=24, shape=plaintext, color=brown];
+
+    Angle -> Degrees
+    Angle -> Turns
+    Angle -> Radians
+}
+
+
diff --git a/beamer/lc-beamer/solution-traits.png b/beamer/lc-beamer/solution-traits.png
new file mode 100644
index 0000000000000000000000000000000000000000..42d6483fb8f0a645493da970a25824df67e84d28
GIT binary patch
literal 9614
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
a863q|Zrc5K_GJbJ1_n=8KbLh*2~7ZTD&Um>

literal 0
HcmV?d00001

diff --git a/beamer/lc-beamer/solution-wrappers.dot b/beamer/lc-beamer/solution-wrappers.dot
new file mode 100644
index 0000000..877c372
--- /dev/null
+++ b/beamer/lc-beamer/solution-wrappers.dot
@@ -0,0 +1,15 @@
+
+digraph SeaOfTypes {
+
+    Real [label="ℝ", fontsize=24, shape=plaintext];
+
+    Degrees [label="Degrees", fontsize=20, shape=plaintext];
+    Turns [label="Turns", fontsize=20, shape=plaintext];
+    Radians [label="Radians", fontsize=20, shape=plaintext];
+
+    Degrees -> Real
+    Turns -> Real
+    Radians -> Real
+}
+
+
diff --git a/beamer/lc-beamer/solution-wrappers.png b/beamer/lc-beamer/solution-wrappers.png
new file mode 100644
index 0000000000000000000000000000000000000000..08103dcd5e5eee81cb5535f59ec41d4b01991495
GIT binary patch
literal 8738
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
Wul?O8J~J>dFnGH9xvX<aXaWG4B?zGa

literal 0
HcmV?d00001