Weekly Report

圏論とHaskellのつながり

週報 05/17-05/23

今回から週報にも固有のタイトルを付ける

今まで無機質な「週報」というタイトルで書いてきたが、あとから内容もわからないし、誰の需要にもリーチできないのでテーマに応じたタイトルをつけることにする(いつの週報かはexcerptに記載する)。

とにもかくにもHaskell

Haskellと圏論のつながりなどを理解しはじめた。

業務でもreactive programmingな話題がチラホラしているので、関数型のパラダイムを確実に理解していきたい。

現時点でのHaskellと圏論についての理解を簡単に述べる。

まず、関数型プログラミングでは参照透過性のある純粋関数でプログラムを書きたいという前提がある。

参照透過性のある純粋関数というのは、めっちゃ砕いて言えば同じ入力に対して常に同じ結果を返すということ。つまりはすべての操作は冪等にしたい。

UNIX哲学にも通ずるところがあるが、ミニマムで単一機能な関数を複数組み合わせてほしい結果を得ましょうねというのが関数型プログラミングの思想の根底にある。

それで、そういうことをしやすくするためにカリー化だったりをするわけだ。

が、現実問題としてそもそも入力という行為からして冪等ではない。Pythonでいえばinput()は常に同じ結果を返さない。当たり前だ。逆にいつも同じだったら単なるリテラルでしかない。

そこで、関数型プログラミングでは、入力のように冪等にできない不純な部分とそれ以外の純粋な部分をキッチリ区分けしようという話になる。

しかも単に分けるだけではダメで、たとえば入力に対して「この関数は2以上50以下の整数を対象にしているから、そうでない場合のエラー処理を入れよう」みたいなことをやってしまうと、関数は肥大化し参照透過性は台無しになる。

整数かもしれないし、そうでないかもしれない値に対して、整数入力を前提としたミニマムな関数安全に使えることが理想だ。

本当にそんなことができるのか、と思ってしまうが、それを実現するための仕組みがモナドやアプリカティブということになる。

そして、このHaskellに出てくるモナドを筆頭とした型で表現される世界は、実は圏論によって体系的な整理をすることができる。しかし、実際に大事なのはモナドによって何ができるかであり、圏論を理解しなければHaskellを使えないということではけっしてなさそうだ。

たとえばよく言われるのがモナドは「自己関手の圏におけるモノイド対象」だというのがあるが、この字面からモナドの便利さに気付くのは不可能に近いのではないか。

どちらかというと(>>=) :: (Monad m) => m a -> (a -> mb) -> mbという操作ができるようにしたいというのが先にあって、「これってどうなってればできるんだっけ? ああ、それは圏論でいうところのホニャララを満たせば常に実現できるね、はいハッピー」という感じだと思う。

まあ、まだ少し文献を読んだ程度で圏論を知らないどころかロクにHaskellでプログラムも書いていない人間なので上記が間違っている可能性は多分にあるのだけど、少なくとも現時点ではこう理解している。

先週との比較

いちおう週報なので進捗表をば。

以前JMESPathノックを書いた際にdetailsタグまわりのスタイルをちゃんと調整したので、積極的に使っていくことにする。

進捗表

前回からの変更部分は太字。個人的な優先度高い順にソートした表。 終わったものは消している。

whatasistobe/comment
家族サービス娘の体調が優れず妻と運用でカバー
すごいHaskellおおむね読了関数型完全に理解する
Haskell次は手を動かす典型90問をHaskellで
圏論これを読んだ圏論そこそこ理解する
RustHaskell効果実感中関数型らしく書けるようになる
競プロレート向上Highest 858水色
典型90問星4までちゃんと追記中問題追加時に追記&星5もやる
社内活動spring-webflux実践中頂点に君臨する
ブログ機能UPCSS調整ほかこれも記事にしたい
収益記事乾燥機で書きたい3000pv/月くらい必要?
競プロ精選100問#14で停滞1日1問くらいは解きたい
数学ガール確率編を読み始めた面白いのでいろいろ読みたい
オライリーRust本ほんの少し読んだ読む
関数型JavaScript半分以上読んだHaskell本を先に
Raku(Perl)こたつがめさん配信で興味詳説 正規表現にも絡む
LINUC少しやりたい気分に上半期には取得
けんちょん本の復習グラフのあたり弱いすべてソラで書ける状態
ネットワークの本積読の本が良書だと紹介あり読破し内容理解する
MCP資格無料券がそろそろ期限できればコンプリートしたい
K8s完全ガイド必要になり少し読んだK8s完全に理解する
Octaveこたつがめさん配信で興味冷静になると優先度は低い
しくみがわかるK8s中盤で停滞K8s完全に理解する
実践コンテナ入門中盤で停滞Docker完全に理解する
CKA/CKAD何もやっていない上半期には取得
マネジメントの会得なにもやっていない組織運営で優秀層に入る
PowerShell完全ガイド序盤で停滞PS完全に理解する
アプリ個人制作知識ばかりで成果物がないできるだけ早く試作を作成する
ブログアクセス数は少ない独自ドメインで10,000PV/M
収入源としてのブログわりと戻ってきた月に10万円の大台を突破したい
TwitterフォロワーUP600人ちょい1000人突破

おわりに

関数型の再帰的な世界観にどっぷり浸かって、多角的な解決手法が脳みそにパパパっと浮かぶようにしたい。