Muitos tipos de óptica têm uma representação de van Laarhoven.
Por exemplo, um Lens
do 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 Functor
restriçã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 Lens
eTraversal
Pelo que entendi: se um Traversal
é como um Lens
que pode ter de zero a muitos alvos, então um Optional
é como um Lens
que 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 PLens
e mais fraco PPrism
"
É possível representar uma função Optional
como van Laarhoven?
Functor
eApplicative
comliftA2
, mas não pura, isso definiria uma óptica com um a muitos alvos? Isso tem um nome?