Haskell Language
二人組
サーチ…
構文
- bimap ::(a→b)→(c→d)→pac→pbd
- まず::(a - > b) - > pac - > pbc
- 第2 ::(b→c)→pab→pac
備考
ミルのFunctor実行は、 単一の型パラメータで共変です。例えば、 fがFunctorであり、 fa与えられ、 a -> bという形式の関数であれば、( fmap使って) fbを得ることができます。
Bifunctorは2つのタイプのパラメータで共変です。場合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
BifunctorのEitherのインスタンスでも、値が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パッケージをインストールする必要があります。