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