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をぱっと見じゃ判断できないね
もう少し調べてみよう。
2025/02/06(木)ゆるGIT学習
今まで仕事ではもっぱらSubversionを使っていた。
WindowsなのでクライアントはTortoiseSVN
新しい仕事でgitを使うことになったのでいろいろ再確認していく。
趣味で使う分には雰囲気で操作しても問題ないんだが、仕事だとさすがに?って思ったので
誤った記載があったら修正しますんでコメントください
基本
originってなんだよ
リモートリポジトリのエイリアス
以下は同じ意味になる
git fetch origin master
git fetch git@github.com:hoge/fuga.git master
HEADってなんだよ
作業中ブランチの最新コミット
コマンド
clone
ざっくりfetch+checkout
リモートの最新を取得し、デフォルトブランチをチェックアウトする。
gitのデフォルトブランチ名はmaster
そういえばgithubは数年前からmainになったね
pull
内部的にはfetch + merge
fetchでorigin/master が最新に更新される
mergeでmaster ブランチに最新が取り込まれる
fetch
リモートの最新を取り込む
ローカルブランチには反映されない
origin/masterは最新になるがmasterはそのまま
merge
2つの異なるブランチの変更を統合する。
この際、マージコミットという特別なコミットが生成される。
A---B---C-----M(マージコミット)
| /
D---E
rebase
ブランチの変更を別のブランチの先頭に付けなおす
いまいち動作を把握しきれていない...
- 元の状態
master: A---B---C---D---E . | dev: D'---E'
devブランチ内でgit rebase masterを処理master: A---B---C---D---E . | dev: D---E---D'---E'
masterブランチ内でgit rebase devを処理master: A---B---C---D---E---D'---E'
checkout
作業ブランチの切り替え
branch
新しいブランチを作成する。
git branch -aですべてのブランチ、作業中のブランチを表示する。
push
ローカルの変更をリモートへ反映させる