diff options
-rw-r--r-- | edit-lens/edit-lens.cabal | 35 | ||||
-rw-r--r-- | edit-lens/package.yaml | 4 | ||||
-rw-r--r-- | edit-lens/src/Control/Edit.lhs | 71 | ||||
-rw-r--r-- | edit-lens/src/Control/Edit/Tree.lhs | 9 | ||||
-rw-r--r-- | edit-lens/src/Control/Lens/Edit.lhs | 78 | ||||
-rwxr-xr-x | thesis.pdf.gup | 10 | ||||
-rw-r--r-- | thesis.tex | 5 |
7 files changed, 98 insertions, 114 deletions
diff --git a/edit-lens/edit-lens.cabal b/edit-lens/edit-lens.cabal deleted file mode 100644 index ab4c575..0000000 --- a/edit-lens/edit-lens.cabal +++ /dev/null | |||
@@ -1,35 +0,0 @@ | |||
1 | -- This file has been generated from package.yaml by hpack version 0.19.3. | ||
2 | -- | ||
3 | -- see: https://github.com/sol/hpack | ||
4 | |||
5 | name: edit-lens | ||
6 | version: 0.0.0.0 | ||
7 | category: Control | ||
8 | author: Gregor Kleen <aethoago@141.li> | ||
9 | license: BSD3 | ||
10 | license-file: LICENSE | ||
11 | build-type: Simple | ||
12 | cabal-version: >= 1.10 | ||
13 | |||
14 | extra-source-files: | ||
15 | ChangeLog.md | ||
16 | |||
17 | source-repository head | ||
18 | type: git | ||
19 | location: https://git.yggdrasil.li/gkleen/pub/bachelor-thesis | ||
20 | |||
21 | library | ||
22 | hs-source-dirs: | ||
23 | src | ||
24 | default-extensions: TypeFamilies FlexibleContexts FlexibleInstances MultiParamTypeClasses FunctionDependencies AllowAmbiguousTypes TypeApplication GADTs | ||
25 | build-depends: | ||
26 | base | ||
27 | , lens | ||
28 | exposed-modules: | ||
29 | Control.Edit | ||
30 | Control.Edit.Tree | ||
31 | Control.Lens.Edit | ||
32 | other-modules: | ||
33 | Control.Lens.Edit.Compose | ||
34 | Paths_edit_lens | ||
35 | default-language: Haskell2010 | ||
diff --git a/edit-lens/package.yaml b/edit-lens/package.yaml index 01b83fa..db1f021 100644 --- a/edit-lens/package.yaml +++ b/edit-lens/package.yaml | |||
@@ -15,9 +15,9 @@ library: | |||
15 | - FlexibleContexts | 15 | - FlexibleContexts |
16 | - FlexibleInstances | 16 | - FlexibleInstances |
17 | - MultiParamTypeClasses | 17 | - MultiParamTypeClasses |
18 | - FunctionDependencies | 18 | - FunctionalDependencies |
19 | - AllowAmbiguousTypes | 19 | - AllowAmbiguousTypes |
20 | - TypeApplication | 20 | - TypeApplications |
21 | - GADTs | 21 | - GADTs |
22 | source-dirs: src | 22 | source-dirs: src |
23 | dependencies: | 23 | dependencies: |
diff --git a/edit-lens/src/Control/Edit.lhs b/edit-lens/src/Control/Edit.lhs new file mode 100644 index 0000000..7be8db4 --- /dev/null +++ b/edit-lens/src/Control/Edit.lhs | |||
@@ -0,0 +1,71 @@ | |||
1 | \begin{comment} | ||
2 | \begin{code} | ||
3 | module Control.Edit | ||
4 | ( Module(..) | ||
5 | ) where | ||
6 | \end{code} | ||
7 | \end{comment} | ||
8 | |||
9 | \begin{defn}[Moduln] | ||
10 | Ein Modul $M$ ist eine \emph{partielle Monoidwirkung} zusammen mit einem schwach-initialen Element\footnote{Gemeint ist hier die übliche Definition von \emph{schwach-initial} aus der Kategorientheorie—ein Modul $M$ bildet eine Kategorie mit Objekten aus $\Dom M$ und Morphismen von $x$ nach $y$ den Monoidelementen $\partial x \in \partial M$ sodass $x \cdot \partial x = y$} (bzgl. der Monoidwirkung) auf dem Träger, d.h. $M = (\Dom M, \partial M, \init_M)$ ist ein Tupel aus einer Trägermenge $\Dom M$, einem Monoid $\partial M$ zusammen mit mit einer partiellen Funktion $\cdot \colon \Dom M \times \partial M \to \Dom$, die \emph{kompatibel} ist mit der Monoid-Struktur: | ||
11 | |||
12 | \begin{itemize} | ||
13 | \item $\forall m \in \Dom M \colon m \cdot 1_{\partial M} = m$ | ||
14 | \item $\forall m \in \Dom M, (e, e^\prime) \in (\partial M)^2 \colon m \cdot (e e^\prime) = (m \cdot e) \cdot e^\prime$ | ||
15 | \end{itemize} | ||
16 | |||
17 | und einem Element $\init_M \in \Dom M$, sodass gilt: | ||
18 | |||
19 | $$ \forall m \in \Dom M \ \exists \partial m \in \partial M \colon m = \init_M \cdot \partial m$$ | ||
20 | |||
21 | Wir führen außerdem eine Abbildung $(\init_M \cdot)^{-1} \colon \Dom M \to \partial m$ ein, die ein $m$ auf ein arbiträr gewähltes $\partial m$ abbildet für das $\init_M \cdot \partial m = m$ gilt. | ||
22 | |||
23 | In Haskell charakterisieren wir Moduln über ihren Monoid, d.h. die Wahl des Monoiden \texttt{m} legt den Träger \texttt{Domain m}, die Wirkung \texttt{apply}, das initiale Element \texttt{init} und $(\init_M \cdot)^{-1}$ eindeutig fest\footnote{Betrachten wir mehrere Moduln über dem selben Träger (oder mit verschiedenen Wirkungen) führen wir neue, isomorphe, Typen ein (\texttt{newtype}-Wrappern)}. | ||
24 | Eine Repräsentierung als Typklasse bietet sich an: | ||
25 | |||
26 | \begin{code} | ||
27 | class Monoid m => Module m where | ||
28 | type Domain m :: * | ||
29 | apply :: Domain m -> m -> Maybe (Domain m) | ||
30 | -- ^ A partial monoid-action of `m` on `Domain m` | ||
31 | -- | ||
32 | -- prop> m `apply` mempty = m | ||
33 | -- prop> m `apply` (e `mappend` e') = (m `apply` e) `apply` e' | ||
34 | init :: Domain m | ||
35 | -- ^ 'init @m' (TypeApplication) is the initial element of 'm' | ||
36 | divInit :: Domain m -> m | ||
37 | -- ^ Calculate a representation of an element of 'Domain m' in 'Del m' | ||
38 | -- | ||
39 | -- prop> init `apply` divInit m = m | ||
40 | \end{code} | ||
41 | \end{defn} | ||
42 | |||
43 | Wir weichen von der originalen Definition von Moduln aus \cite{hofmann2012edit} darin ab, dass wir für das ausgezeichnete Element $\init_X$ des Trägers explizit (und konstruktiv) fordern, dass es ein schwach-initiales Element bzgl. der Monoidwirkung sei. | ||
44 | |||
45 | \begin{comment} | ||
46 | \begin{defn}[Modulhomomorphismen] | ||
47 | Unter einem Modulhomomorphismus zwischen Moduln $M$ und $M^\prime$ verstehen wir ein Paar $(f, \phi$) bestehend aus Abbildungen $f \colon \Dom M \to \Dom M^\prime$ und $\phi \colon \partial M \to \partial M^\prime$, sodass gilt: | ||
48 | \begin{itemize} | ||
49 | \item $\phi$ ist ein Monoidhomomorphismus: | ||
50 | |||
51 | \begin{itemize} | ||
52 | \item $\phi(1_{\partial M}) = 1_{\partial M^\prime}$ | ||
53 | \item $\forall (e, e^\prime) \in (\partial M)^2 \colon \phi(e e^\prime) = \phi(e) \phi(e^\prime)$ | ||
54 | \end{itemize} | ||
55 | \item $f$ erhält das initiale Element: | ||
56 | |||
57 | $$f(\init_M) = \init_N$$ | ||
58 | \item $f$ und $\phi$ sind \emph{kompatibel}: | ||
59 | |||
60 | $$\forall m \in \Dom M, e \in \partial M \colon f(m \cdot e) = f(m) \cdot \phi(e)$$ | ||
61 | \end{itemize} | ||
62 | |||
63 | \begin{code} | ||
64 | {- | ||
65 | data ModuleHom m n where | ||
66 | ModuleHom :: (Module m, Module n) => (Domain m -> Domain n) -> (m -> n) -> ModuleHom m n | ||
67 | -} | ||
68 | \end{code} | ||
69 | \end{defn} | ||
70 | \end{comment} | ||
71 | |||
diff --git a/edit-lens/src/Control/Edit/Tree.lhs b/edit-lens/src/Control/Edit/Tree.lhs new file mode 100644 index 0000000..28320c5 --- /dev/null +++ b/edit-lens/src/Control/Edit/Tree.lhs | |||
@@ -0,0 +1,9 @@ | |||
1 | \begin{comment} | ||
2 | \begin{code} | ||
3 | module Control.Edit.Tree | ||
4 | ( | ||
5 | ) where | ||
6 | |||
7 | import Control.Edit | ||
8 | \end{code} | ||
9 | \end{comment} | ||
diff --git a/edit-lens/src/Control/Lens/Edit.lhs b/edit-lens/src/Control/Lens/Edit.lhs index 7a6cbbe..5a60536 100644 --- a/edit-lens/src/Control/Lens/Edit.lhs +++ b/edit-lens/src/Control/Lens/Edit.lhs | |||
@@ -1,89 +1,13 @@ | |||
1 | Ziel ist es zunächst edit-lenses alá \cite{hofmann2012edit} in Haskell zur Verfügung zu stellen. | ||
2 | Dabei werden wir die Definitionen aus \cite{hofmann2012edit} sowohl in natürlicher Sprache als auch in lauffähigem Haskell vorstellen: | ||
3 | |||
4 | \begin{code} | 1 | \begin{code} |
5 | {-# LANGUAGE TypeFamilies | ||
6 | , FlexibleContexts | ||
7 | , FlexibleInstances | ||
8 | , MultiParamTypeClasses | ||
9 | , FunctionalDependencies | ||
10 | #-} | ||
11 | -- Allow more complicated type families | ||
12 | {-# LANGUAGE AllowAmbiguousTypes #-} | ||
13 | -- AmbiguousTypes are useful if we expect functions to be called via TypeApplication | ||
14 | {-# LANGUAGE GADTs #-} | ||
15 | -- For allowing constraints on constructors | ||
16 | |||
17 | module Control.Lens.Edit | 2 | module Control.Lens.Edit |
18 | ( Module(..) | 3 | ( Module(..) |
19 | , StateMonoidHom | 4 | , StateMonoidHom |
20 | , HasEditLens(..) | 5 | , HasEditLens(..) |
21 | , EditLens(..) | 6 | , EditLens(..) |
22 | ) where | 7 | ) where |
23 | \end{code} | ||
24 | |||
25 | \begin{defn}[Moduln] | ||
26 | Ein Modul $M$ ist eine \emph{partielle Monoidwirkung} zusammen mit einem schwach-initialen Element\footnote{Gemeint ist hier die übliche Definition von \emph{schwach-initial} aus der Kategorientheorie—ein Modul $M$ bildet eine Kategorie mit Objekten aus $\Dom M$ und Morphismen von $x$ nach $y$ den Monoidelementen $\partial x \in \partial M$ sodass $x \cdot \partial x = y$} (bzgl. der Monoidwirkung) auf dem Träger, d.h. $M = (\Dom M, \partial M, \init_M)$ ist ein Tupel aus einer Trägermenge $\Dom M$, einem Monoid $\partial M$ zusammen mit mit einer partiellen Funktion $\cdot \colon \Dom M \times \partial M \to \Dom$, die \emph{kompatibel} ist mit der Monoid-Struktur: | ||
27 | |||
28 | \begin{itemize} | ||
29 | \item $\forall m \in \Dom M \colon m \cdot 1_{\partial M} = m$ | ||
30 | \item $\forall m \in \Dom M, (e, e^\prime) \in (\partial M)^2 \colon m \cdot (e e^\prime) = (m \cdot e) \cdot e^\prime$ | ||
31 | \end{itemize} | ||
32 | |||
33 | und einem Element $\init_M \in \Dom M$, sodass gilt: | ||
34 | |||
35 | $$ \forall m \in \Dom M \ \exists \partial m \in \partial M \colon m = \init_M \cdot \partial m$$ | ||
36 | |||
37 | Wir führen außerdem eine Abbildung $(\init_M \cdot)^{-1} \colon \Dom M \to \partial m$ ein, die ein $m$ auf ein arbiträr gewähltes $\partial m$ abbildet für das $\init_M \cdot \partial m = m$ gilt. | ||
38 | |||
39 | In Haskell charakterisieren wir Moduln über ihren Monoid, d.h. die Wahl des Monoiden \texttt{m} legt den Träger \texttt{Domain m}, die Wirkung \texttt{apply}, das initiale Element \texttt{init} und $(\init_M \cdot)^{-1}$ eindeutig fest\footnote{Betrachten wir mehrere Moduln über dem selben Träger (oder mit verschiedenen Wirkungen) führen wir neue, isomorphe, Typen ein (\texttt{newtype}-Wrappern)}. | ||
40 | Eine Repräsentierung als Typklasse bietet sich an: | ||
41 | |||
42 | \begin{code} | ||
43 | class Monoid m => Module m where | ||
44 | type Domain m :: * | ||
45 | apply :: Domain m -> m -> Maybe (Domain m) | ||
46 | -- ^ A partial monoid-action of `m` on `Domain m` | ||
47 | -- | ||
48 | -- prop> m `apply` mempty = m | ||
49 | -- prop> m `apply` (e `mappend` e') = (m `apply` e) `apply` e' | ||
50 | init :: Domain m | ||
51 | -- ^ 'init @m' (TypeApplication) is the initial element of 'm' | ||
52 | divInit :: Domain m -> m | ||
53 | -- ^ Calculate a representation of an element of 'Domain m' in 'Del m' | ||
54 | -- | ||
55 | -- prop> init `apply` divInit m = m | ||
56 | \end{code} | ||
57 | \end{defn} | ||
58 | |||
59 | Wir weichen von der originalen Definition von Moduln aus \cite{hofmann2012edit} darin ab, dass wir für das ausgezeichnete Element $\init_X$ des Trägers explizit (und konstruktiv) fordern, dass es ein schwach-initiales Element bzgl. der Monoidwirkung sei. | ||
60 | |||
61 | \begin{comment} | ||
62 | \begin{defn}[Modulhomomorphismen] | ||
63 | Unter einem Modulhomomorphismus zwischen Moduln $M$ und $M^\prime$ verstehen wir ein Paar $(f, \phi$) bestehend aus Abbildungen $f \colon \Dom M \to \Dom M^\prime$ und $\phi \colon \partial M \to \partial M^\prime$, sodass gilt: | ||
64 | \begin{itemize} | ||
65 | \item $\phi$ ist ein Monoidhomomorphismus: | ||
66 | 8 | ||
67 | \begin{itemize} | 9 | import Control.Edit |
68 | \item $\phi(1_{\partial M}) = 1_{\partial M^\prime}$ | ||
69 | \item $\forall (e, e^\prime) \in (\partial M)^2 \colon \phi(e e^\prime) = \phi(e) \phi(e^\prime)$ | ||
70 | \end{itemize} | ||
71 | \item $f$ erhält das initiale Element: | ||
72 | |||
73 | $$f(\init_M) = \init_N$$ | ||
74 | \item $f$ und $\phi$ sind \emph{kompatibel}: | ||
75 | |||
76 | $$\forall m \in \Dom M, e \in \partial M \colon f(m \cdot e) = f(m) \cdot \phi(e)$$ | ||
77 | \end{itemize} | ||
78 | |||
79 | \begin{code} | ||
80 | {- | ||
81 | data ModuleHom m n where | ||
82 | ModuleHom :: (Module m, Module n) => (Domain m -> Domain n) -> (m -> n) -> ModuleHom m n | ||
83 | -} | ||
84 | \end{code} | 10 | \end{code} |
85 | \end{defn} | ||
86 | \end{comment} | ||
87 | 11 | ||
88 | \begin{defn}[Zustandsbehaftete Monoidhomomorphismen] | 12 | \begin{defn}[Zustandsbehaftete Monoidhomomorphismen] |
89 | Mit einer Menge von Komplementen $C$ und Monoiden $M$ und $N$ nennen wir eine partielle Funktion $\psi \colon C \times M \to C \times N$ einen zustandsbehafteten Monoidhomomorphismus wenn sie den folgenden Ansprüchen genügt: | 13 | Mit einer Menge von Komplementen $C$ und Monoiden $M$ und $N$ nennen wir eine partielle Funktion $\psi \colon C \times M \to C \times N$ einen zustandsbehafteten Monoidhomomorphismus wenn sie den folgenden Ansprüchen genügt: |
diff --git a/thesis.pdf.gup b/thesis.pdf.gup new file mode 100755 index 0000000..2167f7b --- /dev/null +++ b/thesis.pdf.gup | |||
@@ -0,0 +1,10 @@ | |||
1 | #!/usr/bin/env zsh | ||
2 | |||
3 | gup -u edit-lens/src/Control/Lens/Edit.lhs | ||
4 | gup -u edit-lens/src/Control/Lens/Edit/Compose.lhs | ||
5 | |||
6 | bDir=$(pwd) | ||
7 | |||
8 | cd .. | ||
9 | |||
10 | exec gup/pdf.gup $1 ${bDir}/$2 \ No newline at end of file | ||
@@ -1 +1,6 @@ | |||
1 | Ziel ist es zunächst edit-lenses alá \cite{hofmann2012edit} in Haskell zur Verfügung zu stellen. | ||
2 | Dabei werden wir die Definitionen aus \cite{hofmann2012edit} sowohl in natürlicher Sprache als auch in lauffähigem Haskell vorstellen: | ||
3 | |||
4 | \input{./edit-lens/src/Control/Edit.lhs} | ||
1 | \input{./edit-lens/src/Control/Lens/Edit.lhs} | 5 | \input{./edit-lens/src/Control/Lens/Edit.lhs} |
6 | \input{./edit-lens/src/Control/Edit/Tree.lhs} | ||