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
中實現 。