@aumy_f, 2026-07-14-fp-matsuri:
関数型まつり2026に行ってめちゃめちゃ疲れたのにまだ何か書くんですか
関数型まつり2026に行った感想
aumy_fです。7/11-12にやっていた 関数型まつり2026 に参加して色々聞いてきたので面白かったセッションとかの話をします。
スポ #PR #PR #PR
実は(株)HERPという会社が関数型まつり2026のスポンサーしてて俺もそれで行ってました。俺は去年のまつり行ってなくて実況ツイート見てやっぱ聞きたかったな〜となったので行ってよかった。お金を出してくれた弊社感謝しかなし。実況でタイムラインを埋め尽くしてごめんな。
俺は意思決定者ではないので伝聞形1なんですが、弊社はスポンサーバンバンやって行きたいらしいです。TSKaigiにもスポンサーしてましたね。今後も古今東西のあれやこれやにスポンサーしたりなんかしたりするし俺が送り込まれることもあると思うのでまたどっかのカンファレンスで会いましょう。
「弱い」世界から分解する「データ型」の概念 by Kory
こないだ並行プログラミングについてClaudeと問答してたらいつのまにか余帰納的データ型の話になっててcoってなんじゃいなという気持ちになっていたんですが、セッションを眺めたら余帰納的データ型の話しててワロタとなり、見た。
話としてはまず単純型つきラムダ計算(STLC)というのがあって、こいつは(項に型がついていれば)計算が絶対止まる。世の中の言語はうっかり無限ループを簡単に作れる2 のに対してSTLCやそれに色々を追加したSystem Tなど強正規化する(aka 全域的/totalな)体系は絶対有限時間で評価が終わるのがcoolである3。
で、よくある話で型がついてるプログラムが絶対に停止するという嬉しさがある代償としてプログラムを書くときいわゆる「再帰」に制限がある。我々が普段適当な言語でコード書いててList
再帰的データ型 T は Array.prototype.reduce(Tを受け取って・分解してモニョモニョする) に相当する fold 4 が可能で、余再帰的データ型 U は Iterator.from({ next() {モニョモニョしてUを返す・構築する} }) に相当する unfold が可能。逆にいうと T をunfoldで構築したり U をfoldで解体したりはできない。そして自己呼び出しする関数のうち、再帰的データ型のfoldとして書き換えられるのが再帰関数、余再帰的データ型のunfoldとして書き換えられるのが余再帰関数となる、みたいな話のはず。
(この後はトークで直接やってない考察とかを多く含む)ここの面白さはやはり 無限 の扱い方だと思う。OCamlとかにもあるような再帰的リストはもちろん際限なく Cons(Cons(Cons(...))) って続けられるけど、実際にある値はどっかで Nil にぶち当たって有限な長さをもつ。いかなるリストに対してもそれに Cons して作ったより長いリストが存在する、という意味で型に含まれる値の数は 無限だけど、値として無限の長さをもつ、無限に続く列を表現するリストは作れない5。なので fold みたいな、有限リストを末端まで消費していくような操作は必ず停止する。
逆にJSとかで let i=0; Iterator.from({ next() { return i++; } }) して作れるIteratorオブジェクトは無限に数が続く列を表しているけど、メモリ上に 123456789... って無限に列が確保されているわけではなく、next() した時に次の値が出てくるので、それをいくらやっても尽きることはない、みたいな感じで無限を表現している。それはそれとして無限だろうがなんだろうが next で1ステップ進めること自体は有限なので停止する。foldみたいな無制限に末端まで食い尽くす操作をやろうとすると停止しない可能性があるので許されない6。
「次の値」みたいな観測操作に無限に応答し続ける物体、というのはなんかオブジェクト指向におけるオブジェクトにもそういう側面があるらしく、その辺でやっぱ余帰納に興味がある。まあDOMにおける Element とかReactのコンポーネントとかもそういうところありますよね。GUIというのはやはりページを閉じない限り時間を通して無限に存在し状態変化を続けるのでオブジェクトのモデルが妥当というのはそうかも。その上で、そういうオブジェクト的なものを作るのにはJavaやJSの言語機能としてあるクラスやオブジェクトは別になくてもいい、というのがReact Hooksとかを踏まえた最近のOOPオワコン話なんだと思う。
あと細かい話としてfoldやreduceは畳み込み関数 (b, a) -> b と初期値 b を渡すスタイルなことが多いけど関数を Maybe (b, a) -> b みたいな渡し方して初期値を消すスタイルでもいけるというのを見てあーなるほどこれがJSのiterator protocolが next(): { value: T, done: false } | { done: true } なの7と対応しているんだな〜とか思ったりもした。
総じて「「全て」」に関係があり、なんかあれもこれも全てこれと関係があったんだ!って叫び続ける変な人になっています。面白かったです。
ぼくのかんがえたさいきょうの alt TLA+ by Show
TLA+という言語でアルゴリズムを書くとモデル検査できる、つまりデッドロックするみたいな特定のバグを発見できる。が、制御構造がふつうの言語(ここではCとかを指す)と全然違うのでだるい。そこでa language that compiles to JavaScriptをAltJSと呼ぶノリでalt TLA+が…公式ですでにあるのだが、そいつもやっぱ足りないのでもうちょい高級なのを作ったという話。並行プログラミングにやはり関心があるのでみた。
どう変換していくか、みたいな話が色々あったんだけど、TLA+のプロシージャは値を返せないので仮想的に用意したスタックをみたいな話をしていてだいぶCコンパイラを作っているノリだった。後半では高級な機能を搭載した代償に(TLA+が認識している)状態量が増えてしまっていて検査のパフォーマンスがえらいことになっていたので使わなくなった変数を固定値に書き換えておくといった対策でパフォーマンスを最適化していた。コンパイラでは?
ということで、モデル検査の文字列しか見ずに行って形式検証の話かと思ったら手続的プログラムをスタックマシンにコンパイルする手法の話だったのでウケたのと、並行プログラミングの学習でモデル検査できると楽しそうというおもろみを感じた。いや〜マジで並行プログラミング、そろそろちゃんとやった方がいいんですよね。
感想
そのほかMonad入門について考えたりOCamlの話したくなったりArrowで定義されるDSLの制御構造がReactのrules of hooksに対応している8と聞いていきなり地元の話くるじゃんとなったりインターネットで知ってる人と喋ったりしていました。楽し〜〜ので多分次もあったらいくと思います。何なら登壇りたいことも出てきている。
弊社はHaskell縮小してTS中心に向かっている会社ではあるのでScalaHaskellに自信あるみんな来いとかは言えませんが「「いい設計」」って重要よな…みたいなふわっと関数型と共有するようなヴァイブスは何なら高まっていると思います。ぜひ興味を持ってください。そしてカジュアル面談などに来てください。
あと懇親会のスポンサートークとかでもしてたんですけどTSKaigiから派生イベントが生まれてて、Effect-TS「継続」と「撤退」の境界線〜TSKaigi登壇者たちのパネルトーク〜 というのが7/28(火曜)にあります。リアル関数型トークが聞けると思うので、ぜひ聞きにきてください。
Footnotes
-
パーサコンビネータとか書いてた時期はなんか無限ループしてウケ!とかやってた ↩
-
これ聞いててずっと思ったんですけどDhallっていう設定記述言語があって、JSONとかを吐くために関数とかを使ってガチャれるんですけど無限ループが起きないように構築されてるんですよね。要するに設定を参照するぞ〜って言って無限ループするのはアホすぎるが設定を柔軟に書きたい、的な。 ↩
-
一般的プログラミング感覚だとここで
foldunfoldは自己呼び出しで定義される再帰関数っぽく見えるけどここではfoldunfoldを使って再帰・余再帰関数を定義するのでfoldunfoldの方がプリミティブになる。という雰囲気の話もしていた気がする ↩ -
なんでここでOCaml出すのかというともちろんHaskellが遅延評価するからで、
zeros = 0 : zerosとかいって無限リスト作れてしまうという話をプロポーザルでもしている ↩ -
もちろんJSとかではwhileや再帰を使ってIteratorに対するfoldは定義できるが、そのために使うwhileや再帰は今話している体系ではfold/unfoldを使って定義されるのでできない ↩
-
(b, a) -> bのはb -> (b, a)だけどJSの場合はiteartor protocolに沿うオブジェクト自体が状態を持てるのでメソッド引数に出てこない。てかb -> (b, a)ってStateじゃねえか ↩ -
表現これであってる? ↩