Реализация функтора для типов с более чем одним типом - PullRequest
2 голосов
/ 09 октября 2019

скажем, у меня есть:

trait Get[F[_], A, B]{
  def get(a:A): F[B]
}

Я хочу иметь возможность отобразить тип результата B, т.е. я хочу иметь возможность:

val getFoo: Get[IO, String, Foo] = ???
val foo2Bar: Foo => Bar = ???
val getBar: Get[IO, String, Bar] = getFoo.map(foo2Bar)

Я понимаючто я должен реализовать экземпляр Functor для Get, но я изо всех сил, поскольку я не знаю, какую сигнатуру типа использовать.

Я попробовал следующее:

  • implicit val functor:Functor[Get] = ???

  • implicit val functor: Functor[Lambda[(F[_], K, A) => Get[F, K, A]]] = ???

но они, похоже, не соответствуют нужному типу, так как я не могу использовать расширение синтаксиса функтора, как показано вверху. Как правильно выразить тип здесь? Каким будет эквивалентный тип, если я использую плагин kind-projector?

1 Ответ

4 голосов
/ 09 октября 2019

Попробуйте

import cats.syntax.functor._

implicit def functor[F[_]: Functor, A]: Functor[Get[F, A, ?]] = new Functor[Get[F, A, ?]] {
  override def map[B, B1](fa: Get[F, A, B])(f: B => B1): Get[F, A, B1] = a => fa.get(a).map(f)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...