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?Apply
en el paquete "semigroupoids". hackage.haskell.org/package/semigroupoids-5.3.3/docs/…lens
paquete se llamaTraversal1
type Optional s t a b
es realmente la representación correcta para esa óptica y que todas las leyes apropiadas son válidas? Esto parece un truco mágico. ¿Por qué fuePointed
y no, digamosCopointed
? Para otra óptica dada, ¿cómo podemos adivinar la representación correcta del profunctor?