Что такое Cohoist в скалазе? - PullRequest
0 голосов
/ 12 января 2019

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

Вопрос в том, как лечить этот тип? Может ли кто-нибудь дать объяснение в нескольких словах или привести пример?

1 Ответ

0 голосов
/ 12 марта 2019

ComonadTrans не очень важно для понимания cohoist, что похоже на версию карты более высокого порядка.

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; я не хочу вдаваться в подробности здесь, кроме слов "это не сработает")

Так же, как и map, она поднимает функцию (преобразователь M в N) в F, превращая преобразователь «F из M» в «F из N».

...