hirataraさんのエントリー「"圏論とかモナドなんて簡単だからscalaを使って説明してみた"を検証してみた」は読んでました。そこから辿って、もとのエントリー「圏論とかモナドなんて簡単だからscalaを使って説明してみた」もザッと目は通しました。で、特別に何かを言いたくなるような感じはしませんでしたね。
hirataraさんは、過度に批判的にならないように注意深く書いていて:
先ほど「圏とは言い難い」という表現をしたのだけど、これは「関数1つからなる圏も考えられる」という事実を考慮してのことだ。
mapとflatMapが分かれば実用上問題がないというのはその通りで、それ以上圏や関手、モナドについて踏み込んで厳密に理解する必要はないと言える。「圏論とかモナドなんて不要だからscalaにおける要点だけ説明してみた」ってことあれば全く同意である
僕も、scalaのmapとflatMapに対する心理的な障害を取り除くための解説なんだろうな、と思いまして「それはそれでいいんじゃないの」と。
ところが、今日になって「えっ?」と思ったのは、もとのエントリーを書いたrirakkumyaさんのコメント:
ぼくは単に「モナドの事をscala”で"説明」したかっただけなのですが、「圏論とかモナドなんて不要だから〜」というのは論点がずれてないですか? scalaの要点なんて正直どうでも良いです。
僕は(おそらくはhirataraさんも)、「scalaのmapとflatMap」が主題で、「圏論とかモナド」はオマケだと理解してていたのですが、このコメントだとどうも逆なようです。しかも、僕の書いたエントリーへの参照もあったりして。
ウーム。もし、「圏論とかモナド」が主題で、「scalaのmapとflatMap」が説明の手段だとすると、やっぱりちょっと違うかもしれないね。どう違うかは既にhirataraさんが書いているので繰り返しませんが、幾つかの補足を。
hirataraさんの「関数1つからなる圏も考えられる」はそのとおりで、最近書いた「圏と関手をできるだけ簡単に書き下す方法」の「可愛い圏をガンガン使おう」でも強調したように、僕は小粒な圏は重要だと思ってます。対象が2つで、恒等射をいれて射が3本の圏も有用で、この圏からの関手圏(圏の指数)を考えると二重圏の例を作れたりします。codを射影としてファイブレーション(fibred category)になったりもしますね。面白いですよね。
というわけで、事実上「射が1本」の圏も良い例だと思っていますが、これが典型的な圏の事例と誤解されるとマズイかもしれません。これまたhirataraさんが注意しているように、モナドが主題なら、モナドは自己関手をベースに作られる構造*1(自己関手圏のモノイド)なので、モナドをホストできる圏を例示したほうがいいでしょう。
モナドをホストするために巨大な圏が必要なわけでもなくて、有限集合の圏の上にベキ集合関手でもモナドになります。順序集合(それを圏とみなす)上の増加的単調写像fで、ff = f を満たすモノもモナドです。特に、小数点以下を切り上げて整数にする操作はモナドです。可愛いモナドは色々あります。
「mapとflatMapが分かれば実用上問題がない」のでしょうが、それとモナドを理解するのは少し別です。