Haskell Language
Profunctor
サーチ…
前書き
Profunctor
により提供される型クラスであるprofunctors
パッケージData.Profunctor
。
詳しい説明は、「備考」を参照してください。
構文
- dimap :: Profunctor p =>(a - > b) - >(c - > d) - > pbc - > pad
- lmap :: Profunctor p =>(a - > b) - > pbc - > pac
- rmap :: Profunctor p =>(b - > c) - > pab - > pac
- dimap id id = id
- lmap id = id
- rmap id = id
- dimap fg = lmap f。マップg
- lmap f = dimap f id
- rmap f = dimap id f
備考
Profunctorは、Hackageの文書で説明されているように、「最初の議論は反変的で2番目の議論は共変である。
それはどういう意味ですか?まあ、バイフォンターは普通のファンクターのようなものですが、1つではなく2つのパラメータがあり、それぞれにマップするfmap
ような関数があります。
「共変」とは、 rmap
の2番目の引数が通常のファンクタのようなものであることを意味します。マッピング関数( rmap
)はProfunctor p => (b -> c) -> pab -> pac
という型シグネチャをProfunctor p => (b -> c) -> pab -> pac
ます。これは関数を第2引数にマップするだけです。
"contravariant"なので、最初の議論は少し奇妙になります。通常のファンクタのようにマッピングするのではなく、そのマッピング関数( lmap
)はProfunctor p => (a -> b) -> pbc -> pac
という型シグニチャを持っています。この一見逆方向のマッピングは、関数への入力に対して最も意味があります。入力に対してa -> b
を実行しa -> b
次に新しい入力をa
として実行a
ます。
注意:通常、1つの引数のファンクタの命名は少し誤解を招く: Functor
型クラスを実装し、「共変」ファンクタ、「反変」ファンクタが実装されている間、 Contravariant
中に型クラスData.Functor.Contravariant
、および以前に(誤解を招くと命名) Cofunctor
中に型クラスData.Cofunctor
。
( - >)Profunctor
( - >)は、プロファウンダの簡単な例です。左の引数は関数への入力で、右の引数は読者のファンクタのインスタンスと同じです。
instance Profunctor (->) where
lmap f g = g . f
rmap f g = g . g