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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow