Suche…


Syntax

  • bimap :: (a -> b) -> (c -> d) -> pac -> pbd
  • zuerst :: (a -> b) -> pac -> pbc
  • zweite :: (b -> c) -> pab -> pac

Bemerkungen

Ein Lauf der Mühle Functor ist in einem einzigen Typparameter kovariant. Wenn beispielsweise f ein Functor , dann ein fa und eine Funktion der Form a -> b , kann man ein fb (durch Verwendung von fmap ).

Ein Bifunctor ist in zwei Typparametern kovariant. Wenn f ein Bifunctor , dann eine fab und zwei Funktionen, eine von a -> c und eine andere von b -> d , dann kann man eine fcd (mit bimap ) erhalten.

first sollte man sich eine fmap über den ersten Typparameter fmap , second eine fmap über den zweiten, und bimap sollte so konzipiert werden, dass zwei Funktionen kovariant über den ersten bzw. den zweiten Typparameter bimap werden.

Häufige Instanzen von Bifunctor

Tupel mit zwei Elementen

(,) ist ein Beispiel für einen Typ mit einer Bifunctor Instanz.

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

bimap übernimmt ein Paar von Funktionen und wendet sie auf die jeweiligen Komponenten des Tupels an.

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

Either

Either beiden Bifunctor wählt Bifunctor eine der beiden anzuwendenden Funktionen aus, je nachdem, ob der Wert Left oder Right .

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

erster und zweiter

Wenn eine kovariante Abbildung nur für das erste Argument oder nur für das zweite Argument erwünscht ist, müssen first oder second (anstelle von bimap ) verwendet werden.

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

Zum Beispiel,

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

Definition von Bifunctor

Bifunctor ist die Klasse von Typen mit zwei Typparametern ( f :: * -> * -> * ), die gleichzeitig kovariant abgebildet werden können.

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

bimap kann sich bimap , dass bimap ein Paar von fmap Operationen auf einen Datentyp anwendet.

Eine korrekte Instanz von Bifunctor für einen Typ f muss den Bifunctor-Gesetzen entsprechen , die den Funktorsätzen entsprechen :

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

Die Bifunctor Klasse befindet sich im Data.Bifunctor Modul. Bei GHC-Versionen> 7.10 ist dieses Modul im Compiler enthalten. Für frühere Versionen müssen Sie das bifunctors Paket installieren.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow