diff options
Diffstat (limited to 'edit-lens/src/Control/Lens')
| -rw-r--r-- | edit-lens/src/Control/Lens/Edit.lhs | 5 | ||||
| -rw-r--r-- | edit-lens/src/Control/Lens/Edit/Generic.lhs | 41 |
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} |
| 2 | module Control.Lens.Edit | 3 | module 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 | ||
| 9 | import Control.Edit | 11 | import Control.Edit |
| 10 | \end{code} | 12 | \end{code} |
| 13 | \end{comment} | ||
| 11 | 14 | ||
| 12 | \begin{defn}[Zustandsbehaftete Monoidhomomorphismen] | 15 | \begin{defn}[Zustandsbehaftete Monoidhomomorphismen] |
| 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: | 16 | 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: |
| @@ -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} |
| 47 | data EditLens c m n where | 50 | data 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 | ||
| 50 | class (Module m, Module n) => HasEditLens l m n | l -> m, l -> n where | 53 | class (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} | ||
| 3 | module Control.Lens.Edit.Generic | ||
| 4 | ( idEL, compEL | ||
| 5 | ) where | ||
| 6 | |||
| 7 | import Control.Edit | ||
| 8 | import Control.Lens.Edit | ||
| 9 | |||
| 10 | import Control.Lens | ||
| 11 | \end{code} | ||
| 12 | \end{comment} | ||
| 13 | |||
| 14 | Wir übernehmen einige der in \cite{hofmann2012edit} vorgestellten Konstruktionen für generische edit-lenses. | ||
| 15 | |||
| 16 | Zunä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} | ||
| 21 | idEL :: EditLens () a a | ||
| 22 | idEL = 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} | ||
| 29 | compEL :: EditLens c b c -> EditLens c' a b -> EditLens (c, c') a c | ||
| 30 | compEL (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 | |||
| 41 | Es 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. | ||
