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

时间:2019-02-14 02:38:21

标签: scala haskell functional-programming typeclass scala-cats

我正在查看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)))
  }
}

有人知道吗?我绝对不是第一个人。

1 个答案:

答案 0 :(得分:11)

这叫做 profunctor !它是very useful type of bifunctor出现在整个地方(例如,in the construction of lenses)!在Haskell中,它以Data.Profunctor软件包的profunctors形式提供。我不是Scala员工,但在cats中看起来也是available