Profunctor

正如 Hackage 上的文件所描述的那樣,Profunctors 是“第一個引數是逆變的第二個引數是協變的。”。

那麼這是什麼意思?好吧,bifunctor 就像一個普通的仿函式,除了它有兩個引數而不是一個引數,每個引數都有自己的 fmap 函式來對映它。

作為協變意味著一個 profunctor 的第二個引數就像一個普通的仿函式:它的對映函式(rmap)的型別簽名為 Profunctor p => (b -> c) -> p a b -> p a c。它只是將函式對映到第二個引數。

作為逆變使第一個論點變得有點怪異。它的對映函式(lmap)的型別簽名為 Profunctor p => (a -> b) -> p b c -> p a c,而不是像普通仿函式那樣對映。這個看似向後的對映對於函式的輸入最有意義:你將在輸入上執行 a -> b,然後在你的另一個函式上執行,將新輸入保留為 a

注意: 正常的,一個引數仿函式的命名有點誤導: Functor 型別類實現協變 仿函式,而逆變 仿函式在 Data.Functor.Contravariant中的 Contravariant 型別類中實現 ,而之前的(誤導性命名的) Cofunctor 型別類在 Data.Cofunctor 中實現