Bi的名称 - 具有一个逆变量和一个协变参数的Functor类型类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bi的名称 - 具有一个逆变量和一个协变参数的Functor类型类相关的知识,希望对你有一定的参考价值。

我正在寻找一个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)))
  }
}

有人有想法吗?我绝对不是第一个寻找这个的人。

答案

这被称为profunctor!这是一个very useful type of bifunctor出现在各地(例如,in the construction of lenses)!在Haskell中,它可以在Data.Profunctor包中作为profunctors使用。我不是Scala人,但看起来它也是available中的cats

以上是关于Bi的名称 - 具有一个逆变量和一个协变参数的Functor类型类的主要内容,如果未能解决你的问题,请参考以下文章

CLR 协变逆变

Typescript 中的协变和逆变

java逆变与协变(待完善)

.Net中委托的协变和逆变详解

Kotlin泛型 ③ ( 泛型 out 协变 | 泛型 in 逆变 | 泛型 invariant 不变 | 泛型逆变协变代码示例 | 使用 reified 关键字检查泛型参数类型 )

进入快速通道的委托(深入理解c#)