解释Contramap(Explain Contramap)

2019-08-17 16:51发布

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

Answer 1:

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

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

你会看到, on转换的Ordering[T]Ordering[U]在拍摄功能从UT 。 因此,该方法on证人的事实, Ordering可以被看作是一个Contravariant与仿函数:

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

我也看到了托尼的博客文章和它帮助我终于使得这个三岁的感觉答案从返璞词我的问题之一。



Answer 2:

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

}


文章来源: Explain Contramap
标签: scala