Y a-t-il une représentation de Van Laarhoven de «Facultatif»

15

De nombreux types d'optiques ont une représentation van Laarhoven.

Par exemple, un Lenstype 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 Functorcontrainte 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 LensetTraversal

Si je comprends bien: si un Traversalest comme un Lensqui peut avoir zéro à plusieurs cibles, alors un Optionalest comme un Lensqui peut avoir zéro à une cible.

Dans Monocle, Optionalest 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 PLensplus faible PPrism"

Est-il possible de représenter une Optionalfonction en tant que van Laarhoven?

Joe
la source

Réponses:

10

Il y aurait un moyen de le représenter si la hiérarchie Functor / Applicative / Monad était plus fine. En particulier:

class Functor f => Pointed f where
    pure :: a -> f a

type Optional s t a b = forall f. Pointed f => (a -> f b) -> s -> f t

Notez que le type serait probablement nommé Affinedans la bibliothèque de lentilles s'il était parfaitement dans la hiérarchie des classes.

Carl
la source
1
Cela convient parfaitement à mon cas d'utilisation, qui est une bibliothèque Scala Optics "juste pour le plaisir" où j'ai écrit la hiérarchie de Functor à partir de zéro, et je peux donc faire ce que je veux avec. Ai-je raison de penser que cela suggère que si j'avais également une autre classe de type entre Functoret Applicativeavec liftA2, mais pas pure, cela définirait une optique avec une à plusieurs cibles? Est-ce que cela a un nom?
Joe
1
Cela le suggère. Je n'ai aucune idée du nom de l'optique.
Carl
4
@Joe Cette classe intermédiaire est appelée Applydans le package "semigroupoids". hackage.haskell.org/package/semigroupoids-5.3.3/docs/…
danidiaz
2
... et l'optique correspondante dans le lenspackage est appeléeTraversal1
Benjamin Hodgson
@Carl Comment pouvons-nous vérifier qu'il type Optional s t a bs'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-ce Pointedet pas, disons Copointed? Pour une autre optique donnée, comment deviner la représentation correcte du profoncteur?
winitzki