¿Hay una representación de Van Laarhoven de `Opcional`

15

Muchos tipos de óptica tienen una representación de Van Laarhoven.

Por ejemplo, un Lenstipo Lens s t a b puede representarse como:

 Functor f => (a -> f b) -> s -> f t

Del mismo modo Traversal, a , se puede representar de manera similar, intercambiando la Functorrestricción por Applicative:

 Applicative f => (a -> f b) -> s -> f t

Varios marcos ópticos, como Monocle y Arrow definen un tipo llamado Optional.

En la óptica de Monocle, la jerarquía se Optional ajusta entre LensyTraversal

Según tengo entendido: si un Traversales como un Lensque puede tener cero a muchos objetivos, entonces un Optionales como un Lensque puede tener cero a uno objetivos.

En Monocle, Optionalse define como un par de funciones:

getOrModify :: s -> Either t a 
set :: (b, s) -> t

Los comentarios en el código fuente de Monocle sugieren que también es posible representar un Optional"como cada PLensvez más débil PPrism"

¿Es posible representar un Optionalcomo una función de van Laarhoven?

Joe
fuente

Respuestas:

10

Habría una manera de representarlo si la jerarquía Functor / Aplicativo / Mónada fuera más precisa. En particular:

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

Tenga en cuenta que el tipo probablemente se nombraría Affineen la biblioteca de lentes si estuviera claramente en la jerarquía de clases.

Carl
fuente
1
Esto está convenientemente completamente bien para mi caso de uso, que es una biblioteca de Scala Optics "solo por diversión" donde he escrito la Jerarquía de Functor desde cero y, por lo tanto, puedo hacer lo que quiera con ella. ¿Estoy en lo cierto al pensar que esto sugiere que si también tuviera otra clase de tipo entre Functory Applicativecon liftA2, pero no pura, entonces eso definiría una óptica con uno a muchos objetivos? esto tiene nombre?
Joe
1
Sí sugiere eso. No tengo idea de cómo se llamaría la óptica.
Carl
44
@ Joe Esa clase intermedia se llama Applyen el paquete "semigroupoids". hackage.haskell.org/package/semigroupoids-5.3.3/docs/…
danidiaz
2
... y la óptica correspondiente en el lenspaquete se llamaTraversal1
Benjamin Hodgson
@Carl ¿Cómo podemos verificar que esta type Optional s t a bes realmente la representación correcta para esa óptica y que todas las leyes apropiadas son válidas? Esto parece un truco mágico. ¿Por qué fue Pointedy no, digamos Copointed? Para otra óptica dada, ¿cómo podemos adivinar la representación correcta del profunctor?
winitzki