関数型まつり2025

2025年6月14日(土)、15日(日)と東京・中野セントラルパークで開催された技術カンファレンス「関数型まつり」に参加しました。一般参加者、発表者、スタッフを合わせて500名近くにのぼる大型イベントでした。いろいろな気づきがありましたので情報を共有します。私自身は関数型プログラミングほぼ初心者なので話半分に読んでください。


1日目の最終セッションは プログラミング言語 F# の開発者 Scott Wlaschin さんによる招待講演 “What I have learned from 15 years of functional programming” でした。おそらく何度も発表している入門者向けの関数型プログラミングの説明なのでしょうが「決定論的関数」、「イミュータブル」、「パイプライン」の三大話はとても上手な説明で腑に落ちました。一つ一つのメリットを見聞きしたことはあったのですが、この3つを組み合わせることで変更に対して強固で柔軟なソフトウェアの開発につながることがわかりました。

「決定論的関数」というのは、入力が決まれば出力が一意に決まる関数です。三角関数など数学の関数はこの決定論的関数です。対する「非決定論的関数」はstatic変数やグローバル変数を参照することで入力だけでは出力が決まらないC言語の関数やオブジェクトのプロパティによって出力がかわるメソッドです。非決定論的関数はユニット・テストが煩雑になる、そして、修正や機能追加が困難になるから避けるべきである、という説明でした。そして決定論的関数の出力はイミュータブル(不変)オブジェクトとして扱う、というのが次の主題でした。変数の値が状態遷移していくことはチューリングマシン(=ノイマン型コンピュータ)の振る舞いを模倣することにはなるのですが、模倣していてはプログラムが複雑になる、という説明でした。そしてイミュータブルなオブジェクトでどうやってソフトウェアを組み立てるのか?という問いに対する解決策がパイプラインという仕組みでした。UNIXのシェルコマンドにも似たようなパイプラインの仕組みがありますが。入力⇒関数⇒出力⇒パイプライン⇒入力⇒関数⇒出力⇒パイプライン⇒入力⇒…というふうに関数の出力を次の関数の入力として受け渡す仕組みがパイプラインだという説明でした。オブジェクト指向言語ではメソッド・チェーンとして記述されることもあるのですが、これは「パイプライン」の考え方をもとに設計されている、たまたまパイプラインの記述方法がメソッド・チェーンに姿を変えているだけなのだと気が付いて目から鱗が落ちました。


2日目の朝イチのセッションは東北大学名誉教授 大堀淳さんによる「SML# オープンコンパイラプロジェクト」でした。

SML# は プログラミング言語 ML をベースにしたオープンソースのプログラミング言語で大堀淳先生をはじめとした学術分野の皆さんがプログラミング言語の学術研究のために開発したコンパイラだそうです。発表内容はこのSML#をつかいSQLを統合しSQLのバリデーションを強化した内容の説明でした。ということで宣言型プログラミング言語としてのSQLとSML#が繋がることになります。

その説明の中で印象に残ったのがチューリング・マシンやノイマン式コンピュータとの対比でした。チューリング・マシンは「読み書き可能なテープ」、「テープを読み書きして、かつ、読み書きの順序をシークできる(ジャンプできる)ヘッド」、「ヘッドの読み書きとシークを制御する有限オートマトン(自動機械)」の3つの要素で構成されます。そして有限オートマトンというのがいわゆる「状態遷移機械」になります。読み取った値によって有限の状態に変わるのが有限オートマトンです。add命令をテープから読み込むたびに内部状態が +1, +2, +3,… と遷移するのが雑駁な状態遷移の説明です。

そして命令型プログラミング言語ではこの状態遷移を意識してプログラミングしている。だから変数が +1, +2, +3, … と変化するのをプログラマが意識している。しかし、人がプログラミングするときチューリングマシン(状態遷移機械)を意識する必要があるのか?より抽象的な数学的記述でプログラミングすれば良いのではないか?ここで言う「抽象的」と言う用語はオブジェクト指向の抽象的とはニュアンスが違い、チューリングマシンの対極にある数学的な記述や数学的な思考を意味しています。そして大堀先生の研究と言うのは人の思考に近い数学的記述をコンピューターの命令、すなわちマシン語に翻訳するコンパイラをどういうふうに設計して実装するか?というお話に繋がっていました。先生のお話を伺って数学的な記述がコンピューターの命令の世界にどのように翻訳されて、かつ、チェックされるのか?ということが極極部分的な理解ではありましたが垣間見ることができました。
また翻訳という機能だけでなく、翻訳前のプログラムに対して型の妥当性をいかにしてチェックしているのか?チェックすることで翻訳前のプログラムに紛れ込む誤りを排除するという考え方に感心しました。セキュリティー分野でしばしば耳にする用語ですが「SQLインジェクション」という攻撃手法があります。Webシステムに入力する住所や名前のような文字列にデータベースシステムを騙すデータを紛れ込ませて、不正なプログラムをサーバー側で実行させる攻撃手法です。しかしSML#をつかった型チェックを活用すれば、「ただの文字列(住所や氏名)」に攻撃命令を紛れ込ませることがほぼ不可能になるという説明につながっていました。


明日から組み込みシステムのセンサー入力をI/Oモナドに書き換えることは現実味がないと思います。しかし決定論的関数やイミュータブル・オブジェクトの考え方、実装方法はC言語でも実装できます。テストが容易で機能修正や機能追加に対して強固で柔軟なソフトウェア開発とするために、いろいろな考え方を取り入れることが役立つと感じました。