Viele Arten von Optiken haben eine Van-Laarhoven-Darstellung.
Beispielsweise kann ein Lens
Typ Lens s t a b
wie folgt dargestellt werden:
Functor f => (a -> f b) -> s -> f t
In Traversal
ähnlicher Weise kann a auf ähnliche Weise dargestellt werden, wobei die Functor
Einschränkung gegen Folgendes ausgetauscht wird Applicative
:
Applicative f => (a -> f b) -> s -> f t
Mehrere Optik-Frameworks wie Monocle und Arrow definieren einen Typ namens Optional
.
In Monocles Optik Optional
passt die Erbe zwischen Lens
undTraversal
So wie ich es verstehe: Wenn a Traversal
wie a ist Lens
, das null bis viele Ziele haben kann, dann Optional
ist a wie a Lens
, das null bis eins Ziele haben kann.
In Monocle Optional
wird als ein Funktionspaar definiert:
getOrModify :: s -> Either t a
set :: (b, s) -> t
Kommentare im Monocle-Quellcode legen nahe, dass es auch möglich ist, ein Optional
"als schwächer PLens
und schwächer PPrism
" darzustellen.
Ist es möglich, eine Optional
als van Laarhoven-Funktion darzustellen?
Functor
undApplicative
mitliftA2
, aber keine reine hätte, dann würde dies eine Optik mit einem bis vielen Zielen definieren? Hat das einen Namen?Apply
im Paket "Semigroupoids" aufgerufen . hackage.haskell.org/package/semigroupoids-5.3.3/docs/…lens
Paket heißtTraversal1
type Optional s t a b
tatsächlich die richtige Darstellung für diese Optik ist und ob alle entsprechenden Gesetze gelten? Dies scheint ein magischer Trick zu sein. Warum war esPointed
und nicht sagenCopointed
? Wie können wir für eine andere gegebene Optik die richtige Darstellung des Professors erraten?