圏論と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
タグまわりのスタイルをちゃんと調整したので、積極的に使っていくことにする。
進捗表
前回からの変更部分は太字。個人的な優先度高い順にソートした表。 終わったものは消している。
what | asis | tobe/comment |
---|---|---|
家族サービス | 娘の体調が優れず | 妻と運用でカバー |
すごいHaskell | おおむね読了 | 関数型完全に理解する |
Haskell | 次は手を動かす | 典型90問をHaskellで |
圏論 | これを読んだ | 圏論そこそこ理解する |
Rust | Haskell効果実感中 | 関数型らしく書けるようになる |
競プロレート向上 | Highest 858 | 水色 |
典型90問 | 星4までちゃんと追記中 | 問題追加時に追記&星5もやる |
社内活動 | spring-webflux実践中 | 頂点に君臨する |
ブログ機能UP | CSS調整ほか | これも記事にしたい |
収益記事 | 乾燥機で書きたい | 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フォロワーUP | 600人ちょい | 1000人突破 |
おわりに
関数型の再帰的な世界観にどっぷり浸かって、多角的な解決手法が脳みそにパパパっと浮かぶようにしたい。