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?

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.