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
パッケージをインストールする必要があります。