Расширяя последствия ((x: Int) => x * 4) map ((x: Int) => x * 7)
, мы получаем
ToFunctorOps(((x: Int) => x * 4))(function1Covariant) map ((x: Int) => x * 7)
Подпись function1Covariant
is
implicit def function1Covariant[T]: Monad[T => ?] with ...
при подписи Functor.apply равно
def apply[F[_]](implicit F: Functor[F]): Functor[F] = F
Подставляя F[_]
с ({type F[B] = Int => B})#F
или используя kind-projector
с Int => ?
, мы заставляем apply
требовать неявное
Functor[Int => ?]
, что удовлетворяется function1Covariant[Int]: Monad[Int => ?]
, поскольку Monad
является типом Functor
. Таким образом, мы могли бы написать явно
Functor[({type F[B] = Int => B})#F].map((x: Int) => x * 4)((x: Int) => x * 7)
или использовать кинопроектор как
Functor[Int => ?].map((x: Int) => x * 4)((x: Int) => x * 7)