summaryrefslogtreecommitdiff
path: root/edit-lens/src/Control/Lens/Edit/Generic.lhs
blob: 9dd1b78fc56259f447b6104402b355245e803e3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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.