「ほっ」と。キャンペーン

圏論は面白い(1) メタグラフ

『圏論は面白い』というタイトルからは、圏論を理解している人が解説をしているように見えるかもしれないが、そうではない。Haskell のモナドの使い方がわからなかったので圏論に挑んでみたが、結局は理解できなかった。しかし、圏論の参考書をわからないなりに読んでいるうちに、Haskell のプログラミングの参考になるようなアイディアに気がついたので、少し書いてみたい気がする。

Haskell のモナドを理解するためのきちんとした数学的な解説で分かりやすそうに見えるのが、『モナドへの近道・Haskell からの寄道』という記事だ。以下の記事は、この記事からの引用ですすめていきたい。

上の参考書の最初の『基礎知識の準備』のセクションの冒頭に出てくる定義が「メタグラフ」の定義だ。以下に引用する。
定義 1 (メタグラフ metagraph) メタグラフは射 (arrow) と対象 (object) というデータからなる.各射には演算 dom,cod が定義されており,これらは射を受け取り対象を返す関数である.射 f に対して domf をf ソース,codf を f のターゲットと呼ぶ.
管理人も最初はここで引き返した。

しかし、よく読むと、メタグラフは射と対象という二種類のデータからなるということぐらいは理解できた。対象というのは、数や碁石や美女や酒など何でもいい。要するに物のことだ。射は矢印だ。自分と好きな酒を矢印で結びつけると、物と物を矢印で結んだものだからこれも射だ。自分は酒を飲めるが、酒は自分を飲めないので(そうであることを願っている)から、矢印には方向性がある。

要するに、次のように対象 a, b を矢印 f で繋いだものがメタグラフだ。

      f
a ------> b

もちろん、上の図式はメタグラフの要素を表したもので、対象や射はもっとたくさんあっていい。メタグラフは普通はたくさんの対象が沢山の矢印で繋ぎ合わされたネットワークになる。

このメタグラフには dom と cod という関数が定義されている。しかし、これは対象 a, b の関数ではなく射 f の関数だ。関数の引き数が関数になる形は Haskell でもよく出くわす。圏論でも関数を物と考える所が面白い。じつは、圏論の分かり難さは、このようにいろいろな階層の概念を物と考えたり、物の構成要素と考えたりくるくると見方が変わるところのようだ。

整数などのデータと \x -> x * 2 のような関数を同じ物と考えるのは最初は抵抗があるが、map を初めて使った時、関数を物と考えることによるプログラミングの手軽さに感激した。

Prelude> map (*2) [1,2,3,4,5]
[2,4,6,8,10]

一担この手軽さを経験すると中毒になってしまう。関数は何でも物と考えたくなってしまうのだ。

dom と cod はこのように関数 f を引き数とする関数だ。つまり、高階関数である。そうして、Haskell 風にdom と cod を定義すると、

dom f = a
cod f = b

となる。dom は domain の省略形で、cod は codomain の省略形だ。dom f は射 f を引数に取り、f の左側の対象 a を戻値として返す。cod は射 f を引数に取り、f の矢印の先の対象 b を戻値として返す。そうして、dom f つまり a を射のソースと呼び、cod f つまり b を射の ターゲットと呼ぶ。

こういうふうに考えると、イメージしやすいしよくわかる気がする。

ただ、ここからが数学らしい大変さがはじまる。対象 a ははっきりとイメージできる物でなくても良いのだ。たとえば「自然数の集合」のようなものでもいい。また、矢印も一本の線ではなく、「自然数の集合」から「偶数の集合」への全ての写像の集合のようなものでもいい。とにかく、こっちからあっちへの関係付けは全て射としてとりあつかうことができる。

内部構造の複雑なパソコンも、1台2台と考えると1個の対象であるし、パソコン全体もひとつの対象になる。このように色々なレベルの構造を、ものと考えたり構造と考えたり自由に行き来させる所が圏論の理解し難さの一因だろう。対象や射と表記してあっても、どのレベルで考えられているのか把握できないことが多いのだ。

圏論の抽象性の話はおいておいて上の単純なメタグラフに戻ろう。上のメタグラフは Haskell のプログラムにすることができる。a を 'a' で表し、 b を 'b' で表し、射 f を f = ('a', 'b') とペアで表すことにすると、 dom と cod は次のように定義できる。

Prelude> let f = ('a', 'b')
Prelude> let dom x = fst x
Prelude> let cod x = snd x
Prelude> dom f
'a'
Prelude> cod f
'b'

このように、メタグラフは Haskell のプログラムとして簡単に記述できる。これで、管理人も「圏論なら少しは齧りました、ほんの少しですが。」と胸をはって言うことができる。
[PR]
by tnomura9 | 2012-01-12 06:51 | 圏論 | Comments(0)
<< 圏論は面白い(4) メタ圏(... 天才少年ギタリスト >>