Chapter 03

1.2 合成の性質

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

次の二つは圏における射の合成が満たすべき性質で,非常に重要なものである:

(1) 合成は 結合的 (associative) である.三つの射 f, g, h があって合成ができるとき(つまり射の両端で対象が一致しているとき),合成の順序を指定するためのカッコ () は必要ない.数式では,このことは次のように表される:

h \circ (g \circ f) = (h \circ g) \circ f = h \circ g \circ f

擬似 Haskell コードでは:

f :: A -> B
g :: B -> C
h :: C -> D
h . (g . f) == (h . g) . f == h . g . f

と書ける.("擬似" と書いたのは,関数のイコールは未定義だから.)

関数に関しては結合性はほぼ明らかだが,他の圏においては必ずしも明らかでなかったりする.

(2) 任意の対象 A について,合成に関する 単位 (unit)[1]となる射が存在する.この射は対象からそれ自身へ戻るループになっている.射が合成に関する単位であるとは,それを A から来る,または A へ行く任意の射と合成しても,同じ射となることをいう.この単位的な射は \mathit{id}_A と書かれ,A 上の 恒等射 (identity) という.数式で書けば,fA から B への射だとして,次の二つが成り立つ:

f \circ \mathit{id}_A = f

と,

\mathit{id}_B \circ f = f.

射が関数の場合は,恒等射の実装は恒等関数で,引数をそのまま返すものである.この実装は任意の型について同じなので,これは universally polymorphic[2] である. C++ ならこれはテンプレートとして実装できる:

template<class T> T id(T x) { return x; }

もちろん,C++ では物事はこんな単純にはいかない,なぜなら関数に何を渡すかだけでなく,どう渡すか(つまり,値か,参照か,const参照か,move か,など)についても考えなければいけないから.

Haskell では,恒等関数は標準ライブラリ(Prelude と呼ばれる)に含まれている.次がその宣言と実装である:

id :: a -> a
id x = x

このように,Haskell では多相関数は piece of cake である.宣言文では,ただ型を型変数に置き換えればいい.カラクリはこうだ:具体型は常に大文字で,型変数は常に小文字で表される.従って a で任意の型を表すことができる.

Haskell で関数の定義は,関数の名前の後に,形式的なパラメータを続けて書く(上の例では x 一つだけ).= の後に関数の本体が続く.この簡潔っぷりにニューカマーはしばしば驚くが,すぐにこれは合理的なものだと分かるはずだ.関数の定義と呼び出しは関数プログラミングにおける「パンとバター」[3] なので,その構文は必要最小限の形になっている.引数リストにカッコがないだけでなく,引数たちの間にカンマ , すらない(後々,複数の引数を取る関数を定義する).

関数の本体は常に一つの式 (expression) であり,文 (statements) ではない.上の関数の戻り値はこの式,x である.これが第二の Haskell のレッスンである.

恒等射の条件は,擬似 Haskell で次のように書かれる:

f . id == f
id . f == f

あなたは疑問に思ったかも知れない:なぜ恒等射などというものが大事なのだろうか,何もしない関数なのに.そして続けて思う:ではなぜ 0 という数は大事なのか? 0 は無を表す記号だ.古代ローマ人は 0 のない数の体系を用いて,現在にも残るような素晴らしく精巧な道路や水路を作ることができたではないか.

0\mathit{id} のようなニュートラルな値は,シンボリックな変数を扱う際に極めて有用となる.ローマ人は代数学が得意でなかったのはそのためだ.一方アラブ人やペルシャ人は 0 に慣れ親しんでおり,代数学も得意だった.恒等関数は高階関数の引数または戻り値として,極めて便利なものとなる.高階関数は関数のシンボリックな操作を可能とするものであり,これは "関数の代数学" である.

まとめると:圏は対象と射から成り,射は合成できて結合的である.全ての対象は恒等射を持ち,それは合成に関する単位である.

(和訳:@taketo1024

脚注
  1. 訳注:積における 1, 和における 0 のこと. ↩︎

  2. 訳注:「普遍的多相」とでも言うのでしょうか? ↩︎

  3. 訳注:最も基本的なものの喩えらしい.日本人には「ご飯と梅干し」がそれに当たるだろうか. ↩︎