Closed taretmch closed 3 years ago
identity[Writer[A]] _ >=> の鬼門
Reader 関手も型パラメータを2つ持つので、双関手のように振る舞うのではないかという問題提起。
Reader 関手をちょっと変えた形 A → ? の形のもの(つまり Function1 の第1引数)についての fmap はどうなる?と考えることから始まる。
結果として、第1引数については共変関手を、第2引数については反変関手を考えることになる。
Reader を双関手のように考えたときの一般化した概念が Profunctor である。
2つの型にただ射を適用する bimap ではなく、一方の型に双対圏の射を適用する contramap を考える。
Profunctor は、双対圏と圏の直積から集合圏への関手 C_op x D → Set として定義される。 これは、一つ目の型パラメータに対して共変であり、二つ目の型パラメータに対して反変であることを意味する。Scala 圏における型は集合ととらえることができるため、単に型クラスを実装すればよい。
Profunctor は、ends と coends を学ぶときに出てくるらしい。
ある圏の Hom 集合は、その圏における射の集まりである。これは、(局所的に小さい圏では)ただの集合ととらえてよい。
関手の応用を以下の順でみる。