5

scalaz定义了一个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]
 }

问题是如何治疗这种类型?有人能用几句话解释一下或举个例子吗?

4

1 回答 1

1

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])

(这两个As 不能组合并拉到初始 tparam 列表中;我不想在这里详细说明,只是说“那行不通”)

所以就像 map 一样,它将一个函数(M 到 N 的变换器)提升到F,形成一个“F of M”到“F of N”的变换器。

于 2019-03-12T16:19:00.977 回答