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?