Подтвердить что ты не робот

Объяснить Contramap

Может кто-нибудь объяснить contramap мне? Как выглядит эта реализация? Как выглядят хорошие примеры использования?

// contravariant functor
trait Contravariant[F[_]] {
  def contramap[A, B](f: B => A): F[A] => F[B]
}

Источник: http://tmorris.net/posts/functors-and-things-using-scala/index.html

4b9b3361

Ответ 1

Если вы посмотрите на следующий метод Ordering.on стандартной библиотеки:

def on[U](f: U => T): Ordering[U]

Вы увидите, что on преобразует Ordering[T] в Ordering[U], принимая функцию от U к T Таким образом, метод on свидетелях тот факт, что для Ordering можно рассматривать как Contravariant функтор с:

def contramap[A, B](f: B => A) = (fa: Ordering[A]) => fa.on(f)

Я также видел сообщение в блоге Тони, и оно помогло мне наконец понять смысл этого трехлетнего ответа от ретронима до одного из моих вопросов.

Ответ 2

Предположим, что у вас есть класс Conversion[X, Y] представляющий преобразование из значения типа X в значение типа Y Вы можете объединить это с функцией ? => X ? => X для предварительной обработки ввода или с помощью функции Y=>? постобработать вывод. Например:

trait Conversion[X, Y] { self =>

  def apply(x: X): Y

  def map[Z](f: Y => Z) = new Conversion[X, Z] {
    def apply(x: X): Z = f(self.apply(x))
  }

  def contramap[W](f: W => X) = new Conversion[W, Y] {
    def apply(w: W): Y = self.apply(f(w))
  }

}