De nombreux types d'optiques ont une représentation van Laarhoven.
Par exemple, un Lens
type Lens s t a b
peut être représenté comme:
Functor f => (a -> f b) -> s -> f t
De même, a Traversal
, peut être représenté de manière similaire, en échangeant la Functor
contrainte pour Applicative
:
Applicative f => (a -> f b) -> s -> f t
Plusieurs cadres optiques, tels que Monocle et Arrow, définissent un type appelé Optional
.
Dans l'optique de Monocle, la hiérarchie se Optional
situe entre Lens
etTraversal
Si je comprends bien: si un Traversal
est comme un Lens
qui peut avoir zéro à plusieurs cibles, alors un Optional
est comme un Lens
qui peut avoir zéro à une cible.
Dans Monocle, Optional
est défini comme une paire de fonctions:
getOrModify :: s -> Either t a
set :: (b, s) -> t
Les commentaires dans le code source de Monocle suggèrent qu'il est également possible de représenter un Optional
"comme de plus en PLens
plus faible PPrism
"
Est-il possible de représenter une Optional
fonction en tant que van Laarhoven?
Functor
etApplicative
avecliftA2
, mais pas pure, cela définirait une optique avec une à plusieurs cibles? Est-ce que cela a un nom?Apply
dans le package "semigroupoids". hackage.haskell.org/package/semigroupoids-5.3.3/docs/…lens
package est appeléeTraversal1
type Optional s t a b
s'agit bien de la représentation correcte de cette optique et que toutes les lois appropriées s'appliquent? Cela semble être un tour magique. Pourquoi était-cePointed
et pas, disonsCopointed
? Pour une autre optique donnée, comment deviner la représentation correcte du profoncteur?