ちょくげノート

日々のことを綴ろうと思っています。はてなダイアリーが終了してしまったのではてなブログに全記事移行しました。

Haskell完全に理解したのか?ほんまか?

最近はプログラミング言語Haskellというものにお熱である。SSが書けないのにプログラムが書けるかと言われるとそれはそう(自然言語を組み上げて表現するSSと形式言語を組み上げて表現するプログラムはある種相似形をなす。別件で言及したい。)なのだが、別人格がHaskellをやっているとのことで負けてられないと思い、今年に入ってから放置気味だったHaskellを再びやりだしたのである。

Haskell入門という本を一緒に読んでいたのだが、急にわかりみたいな何かが降ってきてスラスラと読め始めた。こういうブレイクスルーもどきはあるコンテンツに取り組んでいると急に起こるもので、説明がスラスラと頭に入ってきてしまうのである。こうなると早い。完全に理解する日も遠くない。(ほんまか?)

Haskellとは何か、は、他の詳しい記事がオススメなのでそちらに解説を譲るとして、ここではHaskellで私が何をやりたいのかを理想論でつらつらと綴っていきたい。

MtGのループ解析

MtGとはカードゲームの一種で、そのゲームの中で「無限コンボ」が起きてしまう組み合わせを列挙するみたいなプログラムを書いて欲しいという依頼が友人のK氏からあった。K氏は何回も話を聞いている手前申し訳ないながらもうろ覚えだが楕円関数に関連した暗号理論を高校時代から研究している人で、計算機科学に関しても覚えがある人である。

そんな人から「ちょくげ氏、MtGのこういうこれこれこういうアレが……」と話題を振られたのを覚えている。これは実装したいと考えている。果てしなく面倒くさそうに見えるが、やってやれないことはないと思っている。理想だからね。

・ロジバンのパーサ

「いやいやすでにあるやんけ」というツッコミは聞いていない。パーサを作るのは言語の習得の上で必須とも言っていいほどの通過儀礼らしく、これを作れるようになるのが初心者脱出の目標といってもいいらしい。そうなったら馴染みのあるロジバンの構文解析器を作ってみたくなるっていうのが毛の性というもの。Haskellでロジバン解析器、作るぞー。

幸いにして完成品が現役で動いているのでそれを模倣できるようになったら御の字。少しだけでもいいから文章を解析したいね。ロジバンパーサを作れば、ロジバンの勉強にもなるしね。ここのところ因果逆転してるようにも見えるけれど、ロジバンは構文厳密(構文解釈の仕方が1通りしかないように設計されている)だから、構文解析器を作れるということはロジバンの文法にも精通しているということになる。ロジバンの文法に精通していれば、ロジバン作文もホイホイできるようになるかも!?(ほんまか)

競技プログラミング

これはみんなやってる(ほんまか?)からというのもあるけれど、競技プログラミングのような問題を関数型で解決するにはどうしたらいいのか?という、データ構造やアルゴリズムの捉え方の話にもつながってくるので習得したいと考える次第。

この問題ではどのようなデータ型を使って、とか基本的なところはもちろん、それをどのような関数型言語でのアルゴリズムに載せるか、といった応用的なところまで考えられるようになりたいと思っている。そのために、役に立てられるかはわからないけれど、「関数プログラミング 珠玉のアルゴリズムデザイン」という本を買った。まだ読み進めていないけれど、これを読みきった暁には、ある程度の関数型言語でのアルゴリズムを実装できるようになっていると思いたい。アルゴリズムの素人からすると「手続き型でも関数型でも、アルゴリズムアルゴリズムなんじゃないの」とは思うんですけれどね。実装の表現が違うのでしょう。

アルゴリズムとデータ型

これはHaskellは関係ないかな。純粋に、情報系出身の割にはアルゴリズムの知識がソートと二分木に関することしかないのはしょっぱすぎるでしょっていう話。別人格も勉強中みたいだから一緒に勉強したいなって思っている。これの勉強にはMITのふっとい本が役に立つだろうと思っている。近いうちにというか、これはじっくり腰を据えて勉強したい事柄。Pythonで実装できるようになりたいね。Pythonの勉強も進めてるんでした。あっちいったりこっちいったりが激しい。

圏論

これもHaskell関係ない(とは全く言い切れないが、圏論を知らなくてもHaskellはできてしまうし使えてしまうし読めてしまうし書けてしまう)けどモチベが昔からあったので再開しつつ勉強を続けていきたい。

私が知ってる圏論の事柄は離散的で、全く情報が繋がっておらず効率化も統制化もされていないので、まずは知識のまとめ上げをしたいなと思っている。2013年から2016年にかけて圏論のゼミで学んでいたので、その点についてはそこいらのザコよりは知っている方だと思う。ザコよりは。

けれども人に聞かれてアワアワしてしまったりするのはあるので、そうなったらカッコ悪いし、学んできた先輩に申し訳が立たないので、圏論について人に説明できる程度に知識を体系化させておきたい。いま私が知っている圏論の知識は、ゼミの知識が完全に抜け落ちてないと仮定するならばHoCAの一巻くらいはあるし、圏論の基礎くらいは訳ないと思っている。躁入ってるかなこの自意識。ともあれそれだけ知識はあるはずなのだから、体系化しなくては意味がない。頑張ってつなげていくぞ。

圏の局所化についてまで勉強しているはずである。圏においての局所化っていうのは、例えば環におけるそれみたいなものと思えて、比喩するなら「圏論での割り算」であるといえる。一般に局所化とは、形式的な逆元を代数的構造に加える操作だと言えて、圏における局所化というのもやはり形式的な逆元を添えるものなのだといえる。説明になってないな。

Cを圏、WをCの射のあつまりだとする。

CのWによる局所化とは圏C[W^-1]のことであって、

関手Q:C→C[W^-1]が以下の条件を満たすものである。

「全てのw∈Wに関してQ(w)は同型射である。」

「任意の圏Aと任意の関手F:C→Aに関して任意のx∈WでF(w)が同型射となるとき関手FW:C[W^-1]→Aと自然同型F〜FW⚪︎Qが存在する。」

「関手圏の間の写像(-)⚪︎Q:Funct(C[W^-1],A)→Funct(C,A)が各Aにて充満忠実。」

ここで注意しておきたいのがC[W^-1]は圏同値を除いて一意であるということ。

nLabの写しだけど「圏論の技法」にも同じことが書いてあったので良しとしたい。いや覚えてねーじゃねーか()

とにかくやりたいことはこんなもの。がんばるぞい。