taretmch / hamcat

Category Theory for Programmers の勉強記録
https://criceta.com/category-theory-with-scala/
Other
17 stars 0 forks source link

8章 関手性 #17

Closed taretmch closed 3 years ago

taretmch commented 3 years ago

関手の応用を以下の順でみる。

  1. 双関手 (bifunctor) について定義する。
  2. 積と余積を作る操作が双関手であることを示す。
  3. Kleisli が関手であることを示す。Writer 関手を見る。
  4. Reader 関手 Function1[?, A] を見る。
  5. Reader 関手の bimap が定義できるかについて考える。その過程で、関手 Function1[A, ?] を見る。共変関手について定義する。
  6. Profunctor を定義する。
  7. Hom 関手について見る。
taretmch commented 3 years ago

双関手

taretmch commented 3 years ago

積と余積の双関手

taretmch commented 3 years ago

Writer 関手

identity[Writer[A]] _ >=> の鬼門

taretmch commented 3 years ago

Reader 関手

Reader 関手も型パラメータを2つ持つので、双関手のように振る舞うのではないかという問題提起。

Reader 関手をちょっと変えた形 A → ? の形のもの(つまり Function1 の第1引数)についての fmap はどうなる?と考えることから始まる。

結果として、第1引数については共変関手を、第2引数については反変関手を考えることになる。

taretmch commented 3 years ago

Profunctor

Reader を双関手のように考えたときの一般化した概念が Profunctor である。

2つの型にただ射を適用する bimap ではなく、一方の型に双対圏の射を適用する contramap を考える。

Profunctor は、双対圏と圏の直積から集合圏への関手 C_op x D → Set として定義される。 これは、一つ目の型パラメータに対して共変であり、二つ目の型パラメータに対して反変であることを意味する。Scala 圏における型は集合ととらえることができるため、単に型クラスを実装すればよい。

Profunctor は、ends と coends を学ぶときに出てくるらしい。

taretmch commented 3 years ago

Hom 関手

ある圏の Hom 集合は、その圏における射の集まりである。これは、(局所的に小さい圏では)ただの集合ととらえてよい。