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