Szukaj…


Składnia

  • bimap :: (a -> b) -> (c -> d) -> pac -> pbd
  • first :: (a -> b) -> pac -> pbc
  • second :: (b -> c) -> pab -> pac

Uwagi

Uruchomienie młyna Functor jest kowariantne w parametrze jednego typu. Na przykład, jeśli f jest Functor , to biorąc pod uwagę fa i funkcję w postaci a -> b , można uzyskać fb (poprzez użycie fmap ).

Bifunctor jest kowariantem w dwóch parametrach typu. Jeśli f jest Bifunctor , to ma fab i dwie funkcje, jedną z a -> c , a drugą z b -> d , wówczas można uzyskać fcd (używając bimap ).

first należy traktować jako fmap nad parametrem pierwszego typu, second jako fmap nad drugim parametrem, a bimap powinien być pomyślany jako odwzorowanie dwóch funkcji bimap odpowiednio na parametry pierwszego i drugiego typu.

Typowe przypadki Bifunctor

Krotki dwuelementowe

(,) jest przykładem typu, który ma instancję Bifunctor .

instance Bifunctor (,) where
    bimap f g (x, y) = (f x, g y)

bimap bierze parę funkcji i stosuje je do odpowiednich składników krotki.

bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)

Either

Either z instancji Bifunctor wybiera jedną z dwóch funkcji, które mają być zastosowane, w zależności od tego, czy wartość jest Left czy Right .

instance Bifunctor Either where
    bimap f g (Left x) = Left (f x)
    bimap f g (Right y) = Right (g y)

pierwszy i drugi

Jeśli pożądane jest mapowanie tylko pierwszego argumentu lub tylko drugiego argumentu, należy użyć first lub second (zamiast bimap ).

first :: Bifunctor f => (a -> c) -> f a b -> f c b
first f = bimap f id

second :: Bifunctor f => (b -> d) -> f a b -> f a d
second g = bimap id g

Na przykład,

ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"

Definicja bifunkta

Bifunctor to klasa typów z dwoma parametrami typu ( f :: * -> * -> * ), z których oba można jednocześnie zamapować kowariantnie.

class Bifunctor f where
    bimap :: (a -> c) -> (b -> d) -> f a b -> f c d

bimap może być traktowany jako zastosowanie pary operacji fmap do typu danych.

Prawidłowa instancja Bifunctor dla typu f musi spełniać prawa bifunctor , które są analogiczne do praw funktora :

bimap id id = id  -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i  -- composition

Klasa Bifunctor znajduje się w module Data.Bifunctor . Dla wersji GHC> 7.10 ten moduł jest dołączony do kompilatora; we wcześniejszych wersjach musisz zainstalować pakiet bifunctors .



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