Esiste una rappresentazione di Van Laarhoven di "Opzionale"


15

Molti tipi di ottica hanno una rappresentazione di Van Laarhoven.

Ad esempio, un Lenstipo Lens s t a b può essere rappresentato come:

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

Allo stesso modo a Traversal, può essere rappresentato in modo simile, scambiando il Functorvincolo per Applicative:

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

Numerosi framework ottici, come Monocle e Arrow, definiscono un tipo chiamato Optional.

Nell'ottica di Monocle l'erarchia si Optional inserisce tra LenseTraversal

A quanto ho capito: se a Traversalè come uno Lensche può avere zero a molti obiettivi, allora Optionalè come uno Lensche può avere zero a uno obiettivi.

In Monocolo, Optionalè definito come una coppia di funzioni:

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

I commenti nel codice sorgente Monocle suggeriscono che è anche possibile rappresentare un Optional"come sempre più PLensdebole PPrism"

È possibile rappresentare una funzione Optionalcome van Laarhoven?

Risposte:


10

Ci sarebbe un modo per rappresentarlo se la gerarchia di Functor / Applicativa / Monade fosse più dettagliata. In particolare:

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

Si noti che il tipo verrebbe probabilmente nominato Affinenella libreria delle lenti se fosse ordinatamente nella gerarchia di classi.


1
Questo è convenientemente del tutto perfetto per il mio caso d'uso, che è una libreria Scala Optics "solo per divertimento" in cui ho scritto la Gerarchia di Functor da zero, e quindi posso fare tutto ciò che mi piace. Ho ragione nel pensare che ciò suggerisce che se avessi anche un'altra classe di tipo tra Functore Applicativecon liftA2, ma non pura, ciò definirebbe un'ottica con uno o più obiettivi? Questo ha un nome?
Joe,

1
Lo suggerisce. Non ho idea di come si chiamerebbe l'ottica.
Carl,

4
@Joe Quella classe intermedia è chiamata Applynel pacchetto "semigroupoids". hackage.haskell.org/package/semigroupoids-5.3.3/docs/…
danidiaz,

2
... e lenssi chiama l'ottica corrispondente nel pacchettoTraversal1
Benjamin Hodgson

@Carl Come possiamo verificare che questa type Optional s t a bsia effettivamente la rappresentazione corretta per quell'ottica e che tutte le leggi appropriate valgano? Sembra un trucco magico. Perché era Pointede non dire Copointed? Per un'altra data ottica, come possiamo indovinare la corretta rappresentazione del profunctor?
Winitzki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.