2025/12/04(木)プログラマーのための圏論 課題1

プログラマーのための圏論

1. 恒等関数を、好きな言語で(それがたまたまHaskellなら2番目に好きな言語で)できるだけうまく実装せよ。

C++の場合、すでに例が出ているのが後で使うので

template<typename T>
T identity(T arg)
{
    return arg;
}

C#のジェネリクスで書くと以下のようになるか。

public T func<T>(T arg) 
{
    return arg;
}

あと、次の課題のために<functional>のヘッダーを調べたらドンピシャなものがあった。
std::identity


2. 合成関数を好きな言語で実装せよ。このメソッドは2つの関数を引数として受け取り、その合成である関数を返す。

C++の場合

#include <functional>

template <typename T>
T composite(std::function<T(T)> f, std::function<T(T)> g, T a)
{
    return g(f(a));
}

Cの場合
関数ポインタのtypedefってぱっと見でわかりづらいな

typedef int (*fptr)(int);
int composite(fptr f, fptr g, int a)
{
    return g(f(a));
}


3. 合成関数が恒等関数と整合しているかテストするプログラムを作成せよ。

1と2で作った関数を組み合わせて動かせって意味であってるよな?

C++の場合(wandboxで確認)

int main()
{
    int val = composite(identity<int>, identity<int>, 10);
    std::cout << val << std::endl;
}

結果

10


4. ワールドワイドウェブは、何らかの意味で圏だろうか? リンクは射だろうか?

射は対象と対象をつなぐものなので、ページとページをつなぐ場合
リンクは射と言えるはず。
wwwは複数の対象(ページ)とそれらをつなぐ射(リンク)で構成されているので、
wwwは圏と言えるはず。


5. Facebookは人を対象とし友達関係を射とする圏だろうか?

4と同様に複数の対象を人、それらを繋ぐ射を関係性とするならば
Facebookは圏と言えるはず。


6. 有向グラフが圏になるのはどのような場合だろうか?

すいません、有向グラフって何ですか (高卒並感
wikiを見る...
グラフ理論

つながり方だけではなく「どちらからどちらにつながっているか」をも問題にする場合、エッジに矢印をつける。このようなグラフを有向グラフ、または、ダイグラフという。

対象はグラフの各ノード、それらのつながりがエッジとなるので
有向グラフはそもそも圏なのではないか?

問い方から考えると有向グラフそのものは圏ではないと言ってそうだが...
有向グラフについてwikiをぱっと見じゃ判断できないね
もう少し調べてみよう。