このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

関数の適用や結合(合成)の書き方

fとgを関数(写像)として、その結合(合成)は g・f と書かれることが多いです。ここでは黒丸を使いましたが、白丸が普通かな。僕は、g・f が右から左の順序になるのを嫌って f;g を使っています。しかし、g・f という書き方になった理由は(おそらく)関数適用を f(x) と書くからでしょう。f;g と書いてみても、(f;g)(x) = g(f(x)) では台無しです。そこで、f(x) の代わりに x.f にしたいわけですが、あまり一般的じゃないですね。

左から右の順序に拘って f;g や x.f を使っても、記号文字1文字だと紛れたり、優先順位が分かりにくかったりします。最近、記号じゃなくてキーワードにしたらどうかな? と思いました。f;g の代わりに、f then g 、x.f の代わりに x into f と。then や into が語感として適切かどうかは自信がありませんけどね。

(g・f)(x) = g(f(x)) という等式は、セミコロンとドットを使えば、x.(f;g) = (x.f).g ですが、キーワード方式だと x into (f then g) = (x into f) into g です。イコールも is というキーワードにするなら:

  • x into (f then g) is (x into f) into g

大文字の IS は値ではなくて関数として等しいことだとすると、例えば:

  • (f then g) then h IS f then (g then h)

つまり、

  • forall x [x into ((f then g) then h) is x into (f then (g then h))]

ただし、いつでも左から右を守るのは辛いこともあって、Fが高階関数のとき、f into F は F(f) と書いたほうが読みやすくなるときがあります。Fの引数であるfが関数であることを強調するために、F{f} と中括弧を使うことにします。また、f:X -> Y という関数の型(プロファイル)を添えることを許して F{f:X -> Y} と書くと事情がハッキリします。

こんなことを考えた動機は、関手と自然変換の計算をもっと読みやすく記述できないかな、と思ってです。Fが関手のとき、Fの対象部分(object part)は、型パラメータを持つ型構成子として書けます。型パラメータを山形括弧(実際は不等号)に入れて、F<X> としましょう。Fの射部分(morphism part)は、2つの型パラメータを持つ総称高階関数(多相高階関数)として、F.map<X, Y>{f:X -> Y} のように書きます。そして、関手FからGへの自然変換aは、1つの型パラメータを持つ総称関数 a<X>:F<X> -> G<X> となります。

F, Gが関手で、aが自然変換であること、つまり可換図式を満たすことは次のように書けます。


F.map{f:X -> Y} : F<X> -> F<Y>
then
a<Y> : F<Y> -> G<Y>

IS

a<X> : F<X> -> G<X>
then
G.map{f:X -> Y} : G<X> -> G<Y>

多少は読みやすいかな。