有人可以contramap
向我解释一下吗?这个实现会是什么样的?用法的好例子是什么样的?
// contravariant functor
trait Contravariant[F[_]] {
def contramap[A, B](f: B => A): F[A] => F[B]
}
Run Code Online (Sandbox Code Playgroud)
资料来源:http://tmorris.net/posts/functors-and-things-using-scala/index.html
par*_*tic 37
假设你有一个类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))
}
}
Run Code Online (Sandbox Code Playgroud)
huy*_*hjl 23
如果您查看Ordering.on
标准库的以下方法:
def on[U](f: U => T): Ordering[U]
Run Code Online (Sandbox Code Playgroud)
您将看到on
转变的Ordering[T]
成Ordering[U]
而采取的函数U
来T
.因此,该方法on
见证了Ordering
可以被视为Contravariant
仿函数的事实:
def contramap[A, B](f: B => A) = (fa: Ordering[A]) => fa.on(f)
Run Code Online (Sandbox Code Playgroud)
我还看到了Tony发来的博客文章,这帮助我终于理解了这个三年前的答案,从我的一个问题反驳.
归档时间: |
|
查看次数: |
6153 次 |
最近记录: |