解释Contramap

时间:2013-03-17 02:58:06

标签: scala

有人可以向我解释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

2 个答案:

答案 0 :(得分:33)

假设您有一个类Conversion[X,Y],表示从类型X的值到类型Y的值的转换。您可以将其与函数?=>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) )
  }

}

答案 1 :(得分:23)

如果您查看标准库的以下Ordering.on方法:

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

onOrdering[T]执行功能时,您会看到Ordering[U]U转换为T。因此,方法on见证了Ordering可以被视为Contravariant仿函数的事实:

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

我还看到了Tony的博客帖子,这帮助我终于理解了这个三年前的answer从反语到我的一个问题。