Я наткнулся на эту проблему при попытке реализовать класс типа Bifunctior для карт (Bifunctor[Map[_, _]]
).
Bifunctor определяется следующим образом для кошек:
/**
* The quintessential method of the Bifunctor trait, it applies a
* function to each "side" of the bifunctor.
*
* Example:
* {{{
* scala> import cats.implicits._
*
* scala> val x: (List[String], Int) = (List("foo", "bar"), 3)
* scala> x.bimap(_.headOption, _.toLong + 1)
* res0: (Option[String], Long) = (Some(foo),4)
* }}}
*/
def bimap[A, B, C, D](fab: F[A, B])(f: A => C, g: B => D): F[C, D]
Как отмечается в комментарии, эта функция может быть вызвана с использованием двух функций (в одной группе параметров) в качестве входных данных, например: x.bimap(_.headOption, _.toLong + 1)
.Это говорит мне о том, что это явно не вызываемая функция bimap
, так как эта имеет две группы параметров ((fab: F[A, B])(f: A => C, g: B => D)
).Мне было интересно, есть ли какое-то неявное преобразование типов, которое я не знаю, что происходит здесь.Как это работает?Что мне нужно реализовать, чтобы получить класс типа Bifunctor для карт?