summaryrefslogtreecommitdiff
path: root/edit-lens/src/Control/Lens
diff options
context:
space:
mode:
Diffstat (limited to 'edit-lens/src/Control/Lens')
-rw-r--r--edit-lens/src/Control/Lens/Edit.lhs5
-rw-r--r--edit-lens/src/Control/Lens/Edit/Generic.lhs41
2 files changed, 45 insertions, 1 deletions
diff --git a/edit-lens/src/Control/Lens/Edit.lhs b/edit-lens/src/Control/Lens/Edit.lhs
index 5a60536..0a679cb 100644
--- a/edit-lens/src/Control/Lens/Edit.lhs
+++ b/edit-lens/src/Control/Lens/Edit.lhs
@@ -1,13 +1,16 @@
1\begin{comment}
1\begin{code} 2\begin{code}
2module Control.Lens.Edit 3module Control.Lens.Edit
3 ( Module(..) 4 ( Module(..)
4 , StateMonoidHom 5 , StateMonoidHom
5 , HasEditLens(..) 6 , HasEditLens(..)
6 , EditLens(..) 7 , EditLens(..)
8 , module Control.Edit
7 ) where 9 ) where
8 10
9import Control.Edit 11import Control.Edit
10\end{code} 12\end{code}
13\end{comment}
11 14
12\begin{defn}[Zustandsbehaftete Monoidhomomorphismen] 15\begin{defn}[Zustandsbehaftete Monoidhomomorphismen]
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: 16Mit 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:
@@ -45,7 +48,7 @@ In Haskell erwähnen wir die Konsistenzrelation nicht in der Erwartung, dass $\R
45 48
46\begin{code} 49\begin{code}
47data EditLens c m n where 50data EditLens c m n where
48 EditLens :: (Module m, Module n) => c -> StateMonoidHom c m n -> StateMonoidHom c n m -> EditLens c m n 51 EditLens :: c -> StateMonoidHom c m n -> StateMonoidHom c n m -> EditLens c m n
49 52
50class (Module m, Module n) => HasEditLens l m n | l -> m, l -> n where 53class (Module m, Module n) => HasEditLens l m n | l -> m, l -> n where
51 type Complement l :: * 54 type Complement l :: *
diff --git a/edit-lens/src/Control/Lens/Edit/Generic.lhs b/edit-lens/src/Control/Lens/Edit/Generic.lhs
new file mode 100644
index 0000000..9dd1b78
--- /dev/null
+++ b/edit-lens/src/Control/Lens/Edit/Generic.lhs
@@ -0,0 +1,41 @@
1\begin{comment}
2\begin{code}
3module Control.Lens.Edit.Generic
4 ( idEL, compEL
5 ) where
6
7import Control.Edit
8import Control.Lens.Edit
9
10import Control.Lens
11\end{code}
12\end{comment}
13
14Wir übernehmen einige der in \cite{hofmann2012edit} vorgestellten Konstruktionen für generische edit-lenses.
15
16Zunächst bilden edit-lenses die Morphismen einer Kategorie vermöge folgender Konstruktionen:
17
18\begin{defn}[Identität von edit-lenses]
19 Blub % TODO
20\begin{code}
21idEL :: EditLens () a a
22idEL = EditLens () (over _2 id) (over _2 id)
23\end{code}
24\end{defn}
25
26\begin{defn}[Komposition von edit-lenses]
27 Blub % TODO
28\begin{code}
29compEL :: EditLens c b c -> EditLens c' a b -> EditLens (c, c') a c
30compEL (EditLens c1 bc cb) (EditLens c2 ab ba) = EditLens (c1, c2) ac ca
31 where
32 ac ((c1, c2), a) = ((c1', c2'), c)
33 where (c2', b) = ab (c2, a)
34 (c1', c) = bc (c1, b)
35 ca ((c1, c2), c) = ((c1', c2'), a)
36 where (c2', a) = ba (c2, b)
37 (c1', b) = cb (c1, c)
38\end{code}
39\end{defn}
40
41Es ist leider nicht möglich eine Instanz für die Kategorien-Typeklasse der Haskell-Standardlibrary \cite[\texttt{Control.Category}]{base} zu definieren, da sich die Typklasse \texttt{Category} auf Typen vom Kind $\ast \to \ast \to \ast$ einschränkt, \texttt{EditLens} jedoch notwendigerweise den Typ seines Komplements mit sich trägt.