Chapter 43

14.1 Hom関手

さのたけと
さのたけと
2021.06.02に更新

全ての圏は\mathrm{Set}への標準的な写像の族を備えている。これらの写像は実際は関手であって、圏の構造を保つ。そのような写像を作ってみよう。

\mathbf{C}の対象aを固定し、やはり\mathbf{C}の他の対象xを1つ選ぼう。Hom集合\mathbf{C}(a, x)は集合であり、よって\mathrm{Set}の対象である。aを固定したままxを様々に変化させると、\mathbf{C}(a, x)\mathrm{Set}の中で様々に変化する。これで、xから\mathrm{Set}への写像ができる。

Hom集合を2番目の引数についての写像と考えるのを強調したいときには、ダッシュが引数のプレースホルダの役割になっている\mathbf{C}(a, -)という記法を使うことにする。

この対象についての写像は射についての写像に簡単に拡張することができる。任意の対象xyの間の射fをとろう。さっき定義した写像のもとで、対象x\mathbf{C}(a, x)に写され、対象y\mathbf{C}(a, y)に写される。この写像が関手だとしたら、f\mathbf{C}(a, x)から\mathbf{C}(a, y)への関数に写されなければならない。

この関数を各点で、すなわち各引数について個別に定義しよう。引数として、\mathbf{C}(a, x)の任意の元を選ぶことになり、これをhとよぼう。射は、端と端が合っているなら合成することができる。なので、hの終域がfの始域と合うことより、合成

f \circ h \mathtt{::}\ a \to y

aからyへの射である。したがって、これは\mathbf{C}(a, y)の元である。

\mathbf{C}(a, x)から\mathbf{C}(a, y)への関数が見つかったので、これはfの像の役割を果たせる。混同のおそれのないとき、この持ち上げられた関数を\mathbf{C}(a, f)と書き、そのhへの作用を

\mathbf{C}(a, f)~h = f\circ h

と書くことにする。この構成はどんな圏でもうまく行くので、これはHaskellの型の圏でもうまく行くはずだ。Haskellでは、このHom関手はReader関手としてよく知られている:

type Reader a x = a -> x
instance Functor (Reader a) where
    fmap f h = f . h

Hom集合の始域を固定する代わりに終域を固定したときに何が起こるかをみてみよう。言い換えると、写像\mathbf{C}(-, a)もまた関手なのだろうかと問うている。これは、共変である代わりに反変である。これは、同じように射の端と端を合わせようとすると、\mathbf{C}(a, -)の場合で前側に合成していたのと違って、fを後側に合成することになるからである。

この反変関手はHaskellで既に見ている。それをOpとよんでいた:

type Op a x = x -> a
instance Contravariant (Op a) where
    contramap f h = h . f

最後に、両方の対象を様々に動かすとプロ関手(profunctor)\mathbf{C}(-, =)が得られる。この関手は、1つ目の引数について反変で、2つ目の引数(2つの引数は独立に変化するかもしれないことを強調するために、2つ目のプレースホルダには二重のダッシュを使う)について共変である。このプロ関手は、関手性について話をしたときに見た:

instance Profunctor (->) where
    dimap ab cd bc = cd . bc . ab
    lmap = flip (.)
    rmap = (.)

重要な知恵は、この観察はどの圏でも成り立つということである: 対象をHom集合に写すことは関手的である。反変というのは反対圏へ写すことに等価なので、この事実を簡潔に次のように述べることができる:

\mathbf{C}(-, =) \mathtt{::}\ \mathbf{C}^{op} \times \mathbf{C} \to \mathrm{Set}

(和訳:@ashiato45