首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释Contramap

解释Contramap
EN

Stack Overflow用户
提问于 2013-03-17 10:58:06
回答 2查看 9.3K关注 0票数 42

有人能给我解释一下contramap吗?这个实现是什么样子的?什么是好的用法示例?

代码语言:javascript
复制
// 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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-17 11:27:58

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

代码语言:javascript
复制
def on[U](f: U => T): Ordering[U]

您将看到onOrdering[T]转换为Ordering[U],同时将函数从U转换为T。因此,方法on见证了这样一个事实,即Ordering可以被看作是一个Contravariant函数器,它具有:

代码语言:javascript
复制
def contramap[A, B](f: B => A) = (fa: Ordering[A]) => fa.on(f)

我还看到了托尼的博客帖子,它终于帮助我理解了这个三年前的answer,从复古到我的一个问题。

票数 26
EN

Stack Overflow用户

发布于 2013-03-17 17:53:20

假设您有一个Conversion[X, Y]类,表示从X类型的值到Y类型的值的转换。您可以将其与函数? => X结合使用以预处理输入,也可以与函数Y=>?结合使用以对输出进行后处理。例如:

代码语言:javascript
复制
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))
  }

}
票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15457015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档