Muchos tipos de óptica tienen una representación de Van Laarhoven.
Por ejemplo, un Lens
tipo Lens s t a b
puede representarse como:
Functor f => (a -> f b) -> s -> f t
Del mismo modo Traversal
, a , se puede representar de manera similar, intercambiando la Functor
restricción por Applicative
:
Applicative f => (a -> f b) -> s -> f t
Varios marcos ópticos, como Monocle y Arrow definen un tipo llamado Optional
.
En la óptica de Monocle, la jerarquía se Optional
ajusta entre Lens
yTraversal
Según tengo entendido: si un Traversal
es como un Lens
que puede tener cero a muchos objetivos, entonces un Optional
es como un Lens
que puede tener cero a uno objetivos.
En Monocle, Optional
se define como un par de funciones:
getOrModify :: s -> Either t a
set :: (b, s) -> t
Los comentarios en el código fuente de Monocle sugieren que también es posible representar un Optional
"como cada PLens
vez más débil PPrism
"
¿Es posible representar un Optional
como una función de van Laarhoven?
Functor
yApplicative
conliftA2
, pero no pura, entonces eso definiría una óptica con uno a muchos objetivos? esto tiene nombre?