Muitos tipos de óptica têm uma representação de van Laarhoven.
Por exemplo, um Lensdo tipo Lens s t a b pode ser representado como:
Functor f => (a -> f b) -> s -> f t
Da mesma forma a Traversal, pode ser representado de maneira semelhante, trocando a Functorrestrição por Applicative:
Applicative f => (a -> f b) -> s -> f t
Várias estruturas ópticas, como Monocle e Arrow, definem um tipo chamado Optional.
Na óptica do Monocle, a hierarquia Optional se ajusta entre LenseTraversal
Pelo que entendi: se um Traversalé como um Lensque pode ter de zero a muitos alvos, então um Optionalé como um Lensque pode ter de zero a um alvo.
No Monocle, Optionalé definido como um par de funções:
getOrModify :: s -> Either t a
set :: (b, s) -> t
Os comentários no código-fonte do Monocle sugerem que também é possível representar um Optional"como um PLense mais fraco PPrism"
É possível representar uma função Optionalcomo van Laarhoven?
FunctoreApplicativecomliftA2, mas não pura, isso definiria uma óptica com um a muitos alvos? Isso tem um nome?