什么是 scalaz 中的 Cohoist?
What is a Cohoist in scalaz?
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" 转换器。
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" 转换器。