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 中实现