我正在查看Bi-Functor是否存在标准类型类,该类具有一个Contravariant参数和一个Covariant参数。
打出签名(c -> a) -> (b -> d) -> f a b -> f c d
不会得到匹配的结果。
基本上我想在Scala中做
trait CoContraBiFunctor[F[_, _]] {
def ccmap[A, B, C, D](fab: F[A, B])(f: C => A)(g: B => D): F[C, D]
}
implicit val ccFunction: CoContraBiFunctor[Function1] = new CoContraBiFunctor[Function] {
override def ccmap[A, B, C, D](fab: Function[A, B])(f: C => A)(g: B => D): Function[C, D] = new Function[C, D] {
override def apply(c: C): D = g(fab(f(c)))
}
}
有人知道吗?我绝对不是第一个人。
答案 0 :(得分:11)
这叫做 profunctor !它是very useful type of bifunctor出现在整个地方(例如,in the construction of lenses)!在Haskell中,它以Data.Profunctor
软件包的profunctors
形式提供。我不是Scala员工,但在cats
中看起来也是available。