From afc34d76c845f1be96818addcffb4f70d9d2ea9d Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Fri, 24 Nov 2017 17:38:54 +0100 Subject: Work on containers --- edit-lens/src/Control/Lens/Edit.lhs | 5 +++- edit-lens/src/Control/Lens/Edit/Generic.lhs | 41 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 edit-lens/src/Control/Lens/Edit/Generic.lhs (limited to 'edit-lens/src/Control/Lens') 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 @@ +\begin{comment} \begin{code} module Control.Lens.Edit ( Module(..) , StateMonoidHom , HasEditLens(..) , EditLens(..) + , module Control.Edit ) where import Control.Edit \end{code} +\end{comment} \begin{defn}[Zustandsbehaftete Monoidhomomorphismen] 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 \begin{code} data EditLens c m n where - EditLens :: (Module m, Module n) => c -> StateMonoidHom c m n -> StateMonoidHom c n m -> EditLens c m n + EditLens :: c -> StateMonoidHom c m n -> StateMonoidHom c n m -> EditLens c m n class (Module m, Module n) => HasEditLens l m n | l -> m, l -> n where 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 @@ +\begin{comment} +\begin{code} +module Control.Lens.Edit.Generic + ( idEL, compEL + ) where + +import Control.Edit +import Control.Lens.Edit + +import Control.Lens +\end{code} +\end{comment} + +Wir übernehmen einige der in \cite{hofmann2012edit} vorgestellten Konstruktionen für generische edit-lenses. + +Zunächst bilden edit-lenses die Morphismen einer Kategorie vermöge folgender Konstruktionen: + +\begin{defn}[Identität von edit-lenses] + Blub % TODO +\begin{code} +idEL :: EditLens () a a +idEL = EditLens () (over _2 id) (over _2 id) +\end{code} +\end{defn} + +\begin{defn}[Komposition von edit-lenses] + Blub % TODO +\begin{code} +compEL :: EditLens c b c -> EditLens c' a b -> EditLens (c, c') a c +compEL (EditLens c1 bc cb) (EditLens c2 ab ba) = EditLens (c1, c2) ac ca + where + ac ((c1, c2), a) = ((c1', c2'), c) + where (c2', b) = ab (c2, a) + (c1', c) = bc (c1, b) + ca ((c1, c2), c) = ((c1', c2'), a) + where (c2', a) = ba (c2, b) + (c1', b) = cb (c1, c) +\end{code} +\end{defn} + +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. -- cgit v1.2.3