いきなりの続き。朝ごはん食べながら、ちょっと書き足し。
cf. http://d.hatena.ne.jp/bonotake/20090424/1240526962
自分がざっと読んで勝手に解釈した限り、ですけど。しりとりの圏をプログラムに例えるなら… 例えばJavaで、対象はこんな風なクラスで定義されているんですよ。
abstract class ひらがな { void moveTo(ひらがな); } class あ extends ひらがな {...} class い extends ひらがな {...} ...
で、射はこのひらがなクラスのオブジェクトを1つ受け取って、やはりひらがなクラスのオブジェクトを返す関数。
更にいうと、関数の中で許されている操作は、受け取ったオブジェクトのmoveTo()メソッドの呼び出し(呼び出しは何回やってもよい)と、returnでそのオブジェクトを返すだけ。
たとえば「たぬき」という射は、こんな関数。(ややこしいので、関数名のプレフィックスとして morph とつけることにします)
き morphたぬき (た obj) {
obj.moveTo(ぬ);
obj.moveTo(き);
return obj;
}
記法が怪しいとか型チェックは大丈夫なのかとか、そういう心配はおいといて。
でさっき問題になった、「あ」という射と「ああ」という射の違いは、多分こんな感じ。
/** 恒等射 */ あ morphあ (あ obj) { return obj; } /** 恒等射じゃないよ */ あ morphああ (あ obj) { obj.moveTo(あ); // ← ココが違う! return obj; }
こうすれば合成したものと、直に定義したものが同じになるはず。(たとえば あ;あじあ=あじあ、ああ;あじあ=ああじあ)
どうでしょう?まぁ、元のセミナーに出たわけでもないし、なので自分勝手に圏を再定義しています。その意味で外してたらすいません。
1つ強調したいのは、上の あ と ああ の違いでわかるように、a -> a 型の射だからといって恒等射とは限らない、ってことですね。単に「域と余域が同じ」という射は endomorphism といいます(日本語は知らない)。恒等射ってのは endomorphism の中でも非常に特殊なもので、合成しても合成してないのと同じ効果が得られるもの、です。型では決まりません。
しりとりの圏で気になることの1つは、恒等射の扱いが見た目以上にややこしいことですかねぇ…
というところで、ここで本当のタイムアップ。(※ 後でちょびっと追記)