什么是 scalaz 中的 Cohoist?

What is a Cohoist in scalaz?

scalaz defines a Cohoist:

  trait Cohoist[F[_[_], _]] extends ComonadTrans[F] {
    def cohoist[M[_], N[_]: Comonad](f: M ~> N): F[M, ?] ~> F[N, ?]
  }

其中 ComonadTrans 定义为:

 trait ComonadTrans[F[_[_], _]] {
   def lower[G[_]: Cobind, A](a: F[G, A]): G[A]
 }

问题是如何对待这种类型?谁能简单的解释一下或者举个例子?

ComonadTrans 对于理解 cohoist 并不是很重要,这类似于 map 的高阶版本。

map 可以通过翻转参数重新表述为

[A, B](A => B) => (F[A] => F[B])

换句话说,它将函数提升到 F~> 只是

F ~> G
[A]F[A] => G[A]

有了它你可以扩展 cohoist

的签名
[M[_], N[_]: Comonad]([A]M[A] => N[A]) => ([A]F[M, A] => F[N, A])

(这两个A是不能合并拉到初始tparam列表的,这里就不多说了,只说"that would not work")

所以就像 map 一样,它把一个函数(M 到 N 转换器)提升到 F,做一个 "F of M" 到 "F of N" 转换器。