「関数型まつり」に行ってきた

去る6月14日・15日に東京・中野で開催されたイベント「関数型まつり」に行ってきました。と言っても、14日は地元で予定があったので、参加したのは15日だけです。

関数型まつり

3つの部屋でセッションが同時進行しており、どれも面白そうだったので、分身の術を習得しておかなかったのが悔やまれます。

直接聞いた発表に限らず、資料のみ見た発表についても、いい機会だと思って思ったことを書かせてもらいます。

SML#について

SML#プロジェクトのお二人の発表を聞きました。

大堀先生の方は、SQL連携とレコード多相に関する情熱を感じました。TaPLの不適切な記述の話もあり、レコード多相について調べるときは注意したいです。

上野先生の方は、最近の実装の話でした。SML#をAArch64に対応させたい、という話の時に私のZenn記事のリンクが出てきた時は嬉しかったです。相互再帰をジャンプに変換したいという話がありましたが、私もLunarMLに同様の最適化を実装しています(JavaScriptではTCOは仮定できないので)。

私もコンパイラーの実装をやっているので、コンパイラーの裏側の泥臭い話も好きです。

並行並列GCのデバッグで苦労、みたいな話がありましたが、ああいうのを型システムや形式手法でどうにかできないのか、とは少し思いました。

Leanについて

Leanについての発表も聞きました。1日目の発表は聞けていませんが、2日目の2件は聞きました。

Leanは「これから流行る言語」でも取り上げました。生成AIで形式的証明を書かせる研究で使われているのをちょいちょい見かけます。勢いを感じます。

Haskellについて

Haskellの発表も何件かあったようですが、聞けていません。Hasktorchの発表はぜひ聞きたかったのですが、1日目だったので残念です(スライドは見ました)。

Hasktorchはやはりlibtorchのバイナリーに依存している点がネック(とっつきづらい)に見えます。それも性能やデバッグのためには仕方がないということになるのでしょう(スライド49ページ)。

他の言語

私が普段触らないけど興味がある言語、F#やScalaの話も聞けると有意義だなあという気がしましたが、体が一個しかないせいか聞けませんでした。

Gleamの発表は聞きました。

継続と限定継続について

今回の関数型まつりでは、継続の話がちょいちょい出たようです。継続が主題の発表もありましたし、SML#の相互再帰の最適化もcontificationという継続っぽい名前の技術ですし、Gleamのuseも私に言わせればある種の限定継続です。

ここでは、関数型まつりに便乗して継続について語ってみようと思います。

と言っても、継続についてはすでに何回か記事を書いていますが:

詳しいことはこれらの記事を見てもらうとして、ここでは要点を述べます。

「継続」の概念は、関数呼び出しをもつプログラミング言語ならどれでも見出せます。コンパイラーの中間言語で継続を陽に使うこともあります(第一級とは限りませんが)。

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ばかり追いかけている身としては、言語の垣根を越えられるイベントは新鮮でした。運営と発表者、スポンサーの皆様に感謝します。

Spread the love