サーチ…


構文

  • bimap ::(a→b)→(c→d)→pac→pbd
  • まず::(a - > b) - > pac - > pbc
  • 第2 ::(b→c)→pab→pac

備考

ミルのFunctor実行は、 単一の型パラメータで共変です。例えば、 fFunctorであり、 fa与えられ、 a -> bという形式の関数であれば、( fmap使って) fbを得ることができます。

Bifunctor2つのタイプのパラメータで共変です。場合fあるBifunctor 、その後、所定のfab 、そして2つの関数から1 a -> cから、別b -> d 、その後、一方が取得できfcd (使用してbimap )。

firstと考えなければならないfmap 、第一型パラメータにわたってsecondとしてfmap秒以上、そしてbimap 、それぞれ第1および第2のタイプのパラメータにわたって2つの機能covariantlyマッピングとして考えられるべきです。

Bifunctorの共通インスタンス

2要素タプル

(,)は、 Bifunctorインスタンスを持つ型の例です。

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

bimapは一対の関数を取り、それらをタプルのそれぞれのコンポーネントに適用します。

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

Either

BifunctorEitherのインスタンスでも、値がLeftまたはRightどちらであるかによって、適用する2つの関数のEither選択します。

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

第1および第2

第1引数のみ、または第2引数のみを共変にマッピングすることが望まれる場合は、 firstまたはsecondが使用されるべきである( 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

例えば、

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

Bifunctorの定義

Bifunctorは、2つのタイプのパラメータ( f :: * -> * -> * )を持つタイプのクラスであり、どちらも同時に共変にマップできます。

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

bimapは、一対のfmap操作をデータ型に適用するものと考えることができます。

タイプf Bifunctorの正しいインスタンスは、 ファンクタの法則に類似したBifunctor 法則を満たさなければなりません:

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

Bifunctorクラスは、 Data.Bifunctorモジュールにあります。 GHCバージョン> 7.10の場合、このモジュールはコンパイラにバンドルされています。以前のバージョンでは、 bifunctorsパッケージをインストールする必要があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow