有人可以向我解释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
答案 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]
从on
到Ordering[T]
执行功能时,您会看到Ordering[U]
将U
转换为T
。因此,方法on
见证了Ordering
可以被视为Contravariant
仿函数的事实:
def contramap[A, B](f: B => A) = (fa: Ordering[A]) => fa.on(f)
我还看到了Tony的博客帖子,这帮助我终于理解了这个三年前的answer从反语到我的一个问题。