42

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

4

2 回答 2

50

假设您有一个Conversion[X, Y]表示从 type 的值到 typeX的值的转换的类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))
  }

}
于 2013-03-17T09:53:19.517 回答
26

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

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

您会看到on将 a 转换Ordering[T]Ordering[U]while 将函数从Uto T。因此,该方法见证了可以被视为函子on的事实:OrderingContravariant

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

我还看到了托尼的博客文章,它帮助我终于理解了这个三年前的答案,从反义词到我的一个问题。

于 2013-03-17T03:27:57.940 回答