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?Apply
no pacote "semigroupoids". hackage.haskell.org/package/semigroupoids-5.3.3/docs/…lens
pacote é chamadaTraversal1
type Optional s t a b
é realmente a representação correta para essa ótica e se todas as leis apropriadas são válidas ? Isso parece um truque mágico. Por que foiPointed
e não, digamosCopointed
,? Para outra ótica, como adivinhar a representação correta do profunctor?