Объяснить 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
Ответы
Ответ 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))
}
}