Haskell Language
Profunctor
Szukaj…
Wprowadzenie
Profunctor
jest typeclass dostarczone przez profunctors
pakietu w Data.Profunctor
.
Pełne wyjaśnienie znajduje się w sekcji „Uwagi”.
Składnia
- dimap :: Profunctor p => (a -> b) -> (c -> d) -> pbc -> pad
- lmap :: Profunctor p => (a -> b) -> pbc -> pac
- rmap :: Profunctor p => (b -> c) -> pab -> pac
- dimap id id = id
- lmap id = id
- rmap id = id
- dimap fg = lmap f. rmap g
- lmap f = dimap f id
- rmap f = dimap id f
Uwagi
Profunktory są, jak opisano w dokumentach dotyczących hakowania, „dwufunkcyjnym, w którym pierwszy argument jest sprzeczny, a drugi argument jest kowariantny”.
Co to znaczy? Cóż, bifunkor jest jak normalny funktor, tyle że ma dwa parametry zamiast jednego, każdy z własną fmap
podobną do mapy fmap
.
Bycie „kowariantnym” oznacza, że drugi argument profpraktora jest jak zwykły funktor: jego funkcja mapowania ( rmap
) ma sygnaturę typu Profunctor p => (b -> c) -> pab -> pac
. Po prostu odwzorowuje funkcję na drugi argument.
Bycie „sprzecznym” czyni pierwszy argument nieco dziwniejszym. Zamiast mapowania jak normalny funktor, jego funkcja mapowania ( lmap
) ma podpis typu Profunctor p => (a -> b) -> pbc -> pac
. Ten pozornie tył mapowanie największy sens dla wejść do funkcji: by uruchomić a -> b
na wejściu, a następnie drugą funkcję, pozostawiając nowe wejście jako . a
Uwaga: nazewnictwo dla normalnych, jeden funktorów argument jest trochę mylące: w Functor
typeclass implementuje „kowariantna” funktory, natomiast „kontrawariantny” funktory są realizowane w Contravariant
typeclass w Data.Functor.Contravariant
, a wcześniej (myląco nazwany) Cofunctor
kofunkcyjny w Data.Cofunctor
.
(->) Profunctor
(->) jest prostym przykładem profesora: lewy argument jest wejściem do funkcji, a prawy argument jest taki sam jak instancja funktora czytelnika.
instance Profunctor (->) where
lmap f g = g . f
rmap f g = g . g