Czy istnieje van van Laarhoven przedstawienie „Opcjonalne”

15

Wiele rodzajów optyki ma reprezentację van Laarhoven.

Na przykład Lenstyp Lens s t a b może być reprezentowany jako:

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

Podobnie a Traversal, można przedstawić w podobny sposób, zamieniając Functorograniczenie na Applicative:

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

Kilka szkieletów optyki, takich jak Monocle i Arrow, definiuje typ o nazwie Optional.

W Monocle's Optics heirarchia Optional pasuje między LensiTraversal

Jak rozumiem: jeśli a Traversaljest jak taki, Lensktóry może mieć zero do wielu celów, to Optionaljest jak taki, Lensktóry może mieć zero do jednego celu.

W Monocle Optionaljest zdefiniowany jako para funkcji:

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

Komentarze w kodzie źródłowym Monocle sugerują, że możliwe jest również przedstawienie Optional„jako słabszego PLensi słabszego PPrism

Czy można przedstawić Optionalfunkcję van Laarhovena?

Joe
źródło

Odpowiedzi:

10

Byłby sposób na przedstawienie tego, gdyby hierarchia Functor / Applicative / Monad była bardziej precyzyjna. W szczególności:

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

Zauważ, że typ prawdopodobnie zostałby nazwany Affinew bibliotece soczewek, jeśli byłby starannie umieszczony w hierarchii klas.

Carl
źródło
1
Jest to dogodnie całkowicie w porządku w moim przypadku użycia, który jest biblioteką Scala Optics „tylko dla zabawy”, w której napisałem hierarchię Functor od zera, a zatem mogę robić z nią wszystko, co mi się podoba. Czy mam rację, myśląc, że to sugeruje, że gdybym miał także inną klasę typu pomiędzy Functori Applicativez liftA2, ale nie czystą, to zdefiniowałoby to układ optyczny z jednym do wielu celów? Czy to ma imię?
Joe
1
To sugeruje, że. Nie mam pojęcia, jak nazywa się optyka.
Carl
4
@Joe Ta klasa pośrednia jest wywoływana Applyw pakiecie „półgrupy”. hackage.haskell.org/package/semigroupoids-5.3.3/docs/…
danidiaz
2
... a odpowiednia optyka w lenspakiecie nazywa sięTraversal1
Benjamin Hodgson
@Carl W jaki sposób możemy zweryfikować, czy type Optional s t a brzeczywiście jest to prawidłowa reprezentacja tej optyki i czy obowiązują wszystkie odpowiednie prawa? To wydaje się magiczną sztuczką. Dlaczego tak było, Pointeda nie powiedzmy Copointed? W przypadku innej danej optyki, jak możemy odgadnąć prawidłową reprezentację profesora?
winitzki