42

誰か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

4

2 に答える 2

50

typeの値Conversion[X, Y]から type の値への変換を表すクラスがあるとします。入力を前処理する関数または出力を後処理する関数と組み合わせることができます。例えば:XY? => XY=>?

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))
  }

}
于 2013-03-17T09:53:19.517 に答える
26

Ordering.on標準ライブラリの次のメソッドを見ると:

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

関数を からに取りながら、 が を にon変換するOrdering[T]ことがわかります。したがって、このメソッドは、次のファンクターと見なすことができるという事実を証明します。Ordering[U]UTonOrderingContravariant

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

また、Tony からのブログ投稿も見ました。この 3 年前のレトロニムから私の質問への 回答をようやく理解するのに役立ちました。

于 2013-03-17T03:27:57.940 に答える