有人可以向我解释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
有人可以向我解释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
假设您有一个Conversion[X, Y]
表示从 type 的值到 typeX
的值的转换的类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))
}
}
如果你看Ordering.on
标准库的以下方法:
def on[U](f: U => T): Ordering[U]
您会看到on
将 a 转换Ordering[T]
为Ordering[U]
while 将函数从U
to T
。因此,该方法见证了可以被视为函子on
的事实:Ordering
Contravariant
def contramap[A, B](f: B => A) = (fa: Ordering[A]) => fa.on(f)
我还看到了托尼的博客文章,它帮助我终于理解了这个三年前的答案,从反义词到我的一个问题。