Wiele rodzajów optyki ma reprezentację van Laarhoven.
Na przykład Lens
typ 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 Functor
ograniczenie 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 Lens
iTraversal
Jak rozumiem: jeśli a Traversal
jest jak taki, Lens
który może mieć zero do wielu celów, to Optional
jest jak taki, Lens
który może mieć zero do jednego celu.
W Monocle Optional
jest 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 PLens
i słabszego PPrism
”
Czy można przedstawić Optional
funkcję van Laarhovena?
Functor
iApplicative
zliftA2
, ale nie czystą, to zdefiniowałoby to układ optyczny z jednym do wielu celów? Czy to ma imię?Apply
w pakiecie „półgrupy”. hackage.haskell.org/package/semigroupoids-5.3.3/docs/…lens
pakiecie nazywa sięTraversal1
type Optional s t a b
rzeczywiście jest to prawidłowa reprezentacja tej optyki i czy obowiązują wszystkie odpowiednie prawa? To wydaje się magiczną sztuczką. Dlaczego tak było,Pointed
a nie powiedzmyCopointed
? W przypadku innej danej optyki, jak możemy odgadnąć prawidłową reprezentację profesora?