去る6月14日・15日に東京・中野で開催されたイベント「関数型まつり」に行ってきました。と言っても、14日は地元で予定があったので、参加したのは15日だけです。
3つの部屋でセッションが同時進行しており、どれも面白そうだったので、分身の術を習得しておかなかったのが悔やまれます。
直接聞いた発表に限らず、資料のみ見た発表についても、いい機会だと思って思ったことを書かせてもらいます。
SML#について
- SML# オープンコンパイラプロジェクト by 大堀 淳 | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp
- SML#コンパイラを速くする:タスク並列、末尾呼び出し、部分評価機構の開発 by 上野雄大 | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp
SML#プロジェクトのお二人の発表を聞きました。
大堀先生の方は、SQL連携とレコード多相に関する情熱を感じました。TaPLの不適切な記述の話もあり、レコード多相について調べるときは注意したいです。
上野先生の方は、最近の実装の話でした。SML#をAArch64に対応させたい、という話の時に私のZenn記事のリンクが出てきた時は嬉しかったです。相互再帰をジャンプに変換したいという話がありましたが、私もLunarMLに同様の最適化を実装しています(JavaScriptではTCOは仮定できないので)。
私もコンパイラーの実装をやっているので、コンパイラーの裏側の泥臭い話も好きです。
並行並列GCのデバッグで苦労、みたいな話がありましたが、ああいうのを型システムや形式手法でどうにかできないのか、とは少し思いました。
Leanについて
- Lean言語は新世代の純粋関数型言語になれるか? by 井上亜星 | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp(1日目;聞けてない)
- Leanで正規表現エンジンをつくる。そして正しさを証明する by 井山梃子歴史館 | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp
- AWS と定理証明 〜ポリシー言語 Cedar 開発の舞台裏〜 by チェシャ猫 | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp
Leanについての発表も聞きました。1日目の発表は聞けていませんが、2日目の2件は聞きました。
Leanは「これから流行る言語」でも取り上げました。生成AIで形式的証明を書かせる研究で使われているのをちょいちょい見かけます。勢いを感じます。
Haskellについて
- Hasktorchで学ぶ関数型ディープラーニング:型安全なニューラルネットワークとその実践 by 橋本順之 | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp(1日目;聞けてない)
- 「Haskellは純粋関数型言語だから副作用がない」っていうの、そろそろ止めにしませんか? by 山本悠滋 (igrep) | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp(聞けてない)
- Haskell でアルゴリズムを抽象化する 〜 関数型言語で競技プログラミング by Naoya Ito | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp(聞けてない)
Haskellの発表も何件かあったようですが、聞けていません。Hasktorchの発表はぜひ聞きたかったのですが、1日目だったので残念です(スライドは見ました)。
Hasktorchはやはりlibtorchのバイナリーに依存している点がネック(とっつきづらい)に見えます。それも性能やデバッグのためには仕方がないということになるのでしょう(スライド49ページ)。
他の言語
私が普段触らないけど興味がある言語、F#やScalaの話も聞けると有意義だなあという気がしましたが、体が一個しかないせいか聞けませんでした。
Gleamの発表は聞きました。
継続と限定継続について
- continuations: continued and to be continued by びしょ~じょ | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp(1日目;聞けてない)
- ラムダ計算と抽象機械と非同期ランタイム by Kory | トーク | 関数型まつり2025 #fp_matsuri – fortee.jp
今回の関数型まつりでは、継続の話がちょいちょい出たようです。継続が主題の発表もありましたし、SML#の相互再帰の最適化もcontificationという継続っぽい名前の技術ですし、Gleamのuseも私に言わせればある種の限定継続です。
ここでは、関数型まつりに便乗して継続について語ってみようと思います。
と言っても、継続についてはすでに何回か記事を書いていますが:
- LunarMLと継続(2022年5月)
- 限定継続と例外とモナド(2022年5月)
- 限定継続いろいろ(2022年10月)
詳しいことはこれらの記事を見てもらうとして、ここでは要点を述べます。
「継続」の概念は、関数呼び出しをもつプログラミング言語ならどれでも見出せます。コンパイラーの中間言語で継続を陽に使うこともあります(第一級とは限りませんが)。
Schemeやいくつかの言語が特別なのは、「継続」を第一級の値として取り扱い、キャプチャーしたり起動したりすることができる点です。「第一級継続」というやつですね。これがあると、async/awaitみたいなやつを関数にラップした形で提供できます。私の開発しているLunarMLでは、async/awaitを
val async : ('a -> 'b) -> ('a -> 'b promise)
val await : 'a promise -> 'a
という関数として提供しようと思っています。
第一級継続を持たない言語でも、継続を制御する機能が制限された形で提供されていることがあります。ジェネレーターのyieldや、非同期処理のasync/awaitがその例です。Gleamのuseもその類の機能に見えます。もっと古典的なことを言うと、gotoや例外処理も継続を制御する機能といえるでしょう。
詳しいことは過去記事を見てください(繰り返し)。
継続と限定継続とモナドの等価性の話があったようですが、静的型付けがある場合にどのくらい等価なのか少し気になっています。
その他
私はスタッフでもスポンサーでもないのでアレですが、せっかくイベントのWebサイトを持っているのであれば、発表スライドのコピーをイベントのWebサイトに置いておくと良いのではという気がしました。個人のサイトは消えることがありますし、スライドホスティングサービスは広告で使い物にならなくなることがあります。分散して保管しておけば見られなくなるリスクが下げられるのではと思いました。もちろん、HTMLで書かれたスライドは「単にファイルを置くだけ」では済まなかったりするとは思いますが。
私は今回1日しか参加できませんでしたが、普段HaskellとSMLばかり追いかけている身としては、言語の垣根を越えられるイベントは新鮮でした。運営と発表者、スポンサーの皆様に感謝します。