summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--edit-lens/edit-lens.cabal35
-rw-r--r--edit-lens/package.yaml4
-rw-r--r--edit-lens/src/Control/Edit.lhs71
-rw-r--r--edit-lens/src/Control/Edit/Tree.lhs9
-rw-r--r--edit-lens/src/Control/Lens/Edit.lhs78
-rwxr-xr-xthesis.pdf.gup10
-rw-r--r--thesis.tex5
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
5name: edit-lens
6version: 0.0.0.0
7category: Control
8author: Gregor Kleen <aethoago@141.li>
9license: BSD3
10license-file: LICENSE
11build-type: Simple
12cabal-version: >= 1.10
13
14extra-source-files:
15 ChangeLog.md
16
17source-repository head
18 type: git
19 location: https://git.yggdrasil.li/gkleen/pub/bachelor-thesis
20
21library
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}
3module Control.Edit
4 ( Module(..)
5 ) where
6\end{code}
7\end{comment}
8
9\begin{defn}[Moduln]
10Ein 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
17und 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
21Wir 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
23In 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)}.
24Eine Repräsentierung als Typklasse bietet sich an:
25
26\begin{code}
27class 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
43Wir 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]
47Unter 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{-
65data 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}
3module Control.Edit.Tree
4 (
5 ) where
6
7import 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 @@
1Ziel ist es zunächst edit-lenses alá \cite{hofmann2012edit} in Haskell zur Verfügung zu stellen.
2Dabei 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
17module Control.Lens.Edit 2module 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]
26Ein 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
33und 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
37Wir 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
39In 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)}.
40Eine Repräsentierung als Typklasse bietet sich an:
41
42\begin{code}
43class 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
59Wir 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]
63Unter 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} 9import 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{-
81data 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]
89Mit 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: 13Mit 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
3gup -u edit-lens/src/Control/Lens/Edit.lhs
4gup -u edit-lens/src/Control/Lens/Edit/Compose.lhs
5
6bDir=$(pwd)
7
8cd ..
9
10exec gup/pdf.gup $1 ${bDir}/$2 \ No newline at end of file
diff --git a/thesis.tex b/thesis.tex
index adc6515..f975ba7 100644
--- a/thesis.tex
+++ b/thesis.tex
@@ -1 +1,6 @@
1Ziel ist es zunächst edit-lenses alá \cite{hofmann2012edit} in Haskell zur Verfügung zu stellen.
2Dabei 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}