Scala 解释对比图

Scala 解释对比图,scala,Scala,谁能给我解释一下contracmap?这个实现是什么样子的?好的用法示例是什么样的 // contravariant functor trait Contravariant[F[_]] { def contramap[A, B](f: B => A): F[A] => F[B] } 来源:如果您查看标准库的以下方法: def on[U](f: U => T): Ordering[U] 您将看到,上的将排序[T]转换为排序[U],同时将函数从U转换为T。因此上的方法见证了

谁能给我解释一下
contracmap
?这个实现是什么样子的?好的用法示例是什么样的

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

来源:

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

def on[U](f: U => T): Ordering[U]
您将看到,上的
排序[T]
转换为
排序[U]
,同时将函数从
U
转换为
T
。因此
上的
方法见证了这样一个事实,即
排序
可以被视为一个
逆变
函子,具有:

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

我还看到了Tony的博客文章,它帮助我最终理解了这个三岁的孩子从我的问题中的一个

假设您有一个类
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))
  }

}

你的意思是“从
X
类型的值到
Y
类型的值”吗?@huynhjl谢谢。我修正了打字错误。