こんにちは、びしょ〜じょです。

関数型まつりお疲れ様でした

発表あざした、さらっと流す予定だがガッツリ飛ばしたよもやま話

今回はこんなテーマで発表させていただきました。

会場3つに分かれてましたがたくさん聞きに来てくれた方々がいらっしゃって大変ありがとうございました。 一方 は発表直前までスライドを作っており何をしているのか。小学校の夏休みの宿題かって。 いい加減にしなさい。

スライドを直前まで作っていた皆さん……… めっちゃわかります 。 何がわかる念という感じですが、分かり手させてもらいます。次も頑張りましょう。

さて、今回はLLM言語とりあえず作るンゴw→その後サーベイという流れだったんで、既知の成果をとりいれられてなかった。 ってかさあLLM向けの言語というのが(ホンマに必要なんですかというのも含め)未開拓なんで、とりあえずこういう話があるんで煙のないところに火を灯すというモチベの発表でした。

よもやま話は半分妄想で書いてたんだけど喋りたくはあった。

型システムはリッチすぎるとLLMくん困っちゃうなんてある?

型システムおよび型エラー報告がLLMのコード生成ループの品質を上げるという話をした。 でもさーw 型システムが強すぎると直せないとか人間もあるやないですか。 特にLLMは簡単な四則演算や単語中に含まれる文字を数え上げるといった人間の小学生ならできそうなことが不得意なことが知られている。 なんで、依存型はLLMちゃんと書けるのか? というのと、エラーを見て修正というのが回せるのか? という疑問が個人的にある。 何らかのガードレールとか言語側の工夫があればいけんのかな? というふわっとした考えでした。

またサブタイピング? もなんだかなあって感じだった。 Nexus言語は例外の定義をまとめる機能としてexception groupというものがある。

A LLM-friendly language

Scala2時代のADTsの定義っぽい感じですな。 で処理系がセルフホストなんで、パイプラインごとにexception groupを定義して〜というのをやってほしいんだけど、ナイーブに実装してるところを見てたら全くexception groupを定義しない、または過剰なgroupを作ってしまうなど、人間様がちゃんと指示しないとアカンという感じだった。 サブタイピングっつうとやや微妙かもしれんが、懸念としては神クラスとかね。 プログラミングってか、状況に応じて過不足無いものを揃えるというタスクがそもそもLLM不得意そうだ。 不相応な言葉遣いやPRの過剰なチェックややることリストと思えば全然基本ができてへんやんけみたいな…おなじみですね。 ただ、この辺はガイドラインをうまくひけばなんとかなりそうだ。

とはいえ難しければ全部ムズいってわけでもなさそうだ。 文字みたいなトークンをさらに分解して探索というのはムズい一方、エフェクト列や集合から要素を発見するというのはまあまあできてそう。 それと翻訳が得意なんで、型に状態をうまくエンコードしてステートマシン〜みたいなのはわりと得意分野そうだった。 人間が思うナイーブな型の難しさってよりかは、どんなタスクに帰着するのかって方向で見たほうがいいかもしれない。

ユーザーレベル型エラー改善ブーム

今回のkonnさんの発表でも一瞬でてきたGHC.Type.Errorは型エラーのメッセージを変えられるすごいやつだよ

人間さんは嬉しいんですが、 AIとしてもcannot deduce hogehogehoge.....よりは、例えば次どう直すかが明らかなメッセージのほうがself-repairを回しやすく、読み込み→修正サイクルにかかるトークン消費量も抑えられるだろうと予想できる。 リフレクションなどではなく型システムの上でやれているのが、Haskellのつええところですね。 ScalaやRustなども、implicit parameterやtrait解決に失敗するときのカスタムエラーをアノテーションで書き換える機能があるらしい。

他にも、(一見)強力な型を埋め込むことで送出できる型エラーの情報を豊かにできる。 近年流行りのエフェクトシステムの埋め込みがこれですね。 例えば、エフェクトシステムがないといえばない1TypeScriptにEffect-TSでエフェクトシステムを構築すると、いわゆる副作用による意図せぬ2エラーが型検査時に検知でき、LLMへのフィードバックが迅速におこなえる。

Effect is a powerful TypeScript library designed to help developers easily create complex, synchronous, and asynchronous programs.

プログラム変換の研究をしてたおかげで勘所がなんとなく分かるんで、よかったですね。

Early return…どうかな

ここはもっと妄想なんで大した話でもない。 人間と同じであんまりネストするとよくないねという程度。 その程度ではあるが、巨大な式があり、subexpressionに潜っていき…という関数型ってか式指向な言語よりは、statement listのほうがいわゆる"行ごとに読む"ができてLLMのワーキングメモリーにも優しいのか? と少し思っている。 で、そうなるとreturnという何気なくつかっているが強力なコントロール抽象は必須ですなあ。 あるいは式指向の言語にバックポートしてもえんちゃうかなとか少し思ったりする。 まず継続をaffinelyに、しかも末尾でのみ使えるtail-affine continuation monad(?)を用意し、関数は全てその中で評価され、全てのexpressionがそのmonadに持ち上がっておりいつでもreturnable…とすると意味論的にやれそうか? でもすでにlinear typesがある言語とかどうなるんでしょうねHaskellとか。returnをspecial formの式として扱い、return :: \a b. a -> b として return () + linearValue を…最高やな。

ちなみに: 研究資金

最初とりあえずGeminiを使っていたが即limitひっかかり奴なんでVertex APIを利用したところ3万円くらいが数日で吹っ飛んだんで涙を流しました。 その後Claude CodeのPro MAXに変更して毎月3万×5ヶ月吹っ飛ぶようになってやや涙が出ました。 インターネットなどで私を見かけたら優しくしてください。

ふーん、おもしれぇ発表…

さすがと言わんばかりの発表ばかりでした今年も。

# セッションのテーマ- 言語- 導入/活用事例# 想定する聴衆/前提知識- OCamlや関数型プログラミング未経験だが、興味がある方- OCamlを使ってみたい方# 聴衆が得られるもの- OCamlの採用事例- メジャーアップデート後の「今のOCaml」の魅力# セッションの概要OCamlは2022年末にメジャーバージョン5.0がリリースされ、並行並列をプリミティブに扱えるようになりました。その後も継続的にアップデートが繰り返され、コミュニティも盛り上がりを見せています。一方で、残念ながら、日本でOCamlの採用事例や話題を聞くことは多くありません。並行並列は現代のプログラミングにおいて必須の項目であり、OCamlが採用しているAlgebraic Effects and Handlersは他の言語でも話題にあがりつつあります。さらに昨今、AIによるコーディング支援の台頭により、パラダイムの異なる新しい言語を学習・導入するハードルはかつてないほど下がっています。今こそ、新たな選択肢としてOCamlを取り入れる絶好のタイミングです。本セッションでは、実際に業務の中で小さなアプリから採用してみた事例を紹介することで「OCamlのいま」を伝えます。特に、関数型言語に触れたことがない方にも向けて解説しますので、この機にOCamlの世界を覗いてみませんか?

うおお日本でもOCamlを仕事にできるのかよ〜アサインが自分だけのプロジェクト故にやれてるという話でしたが、さらに拡大してOCamlの国を作っていってほしいですね。 エフェクトハンドラをガッツリ使ってたりと実装もなかなか実践アドバンスドな内容だった。

# セッションのテーマ(該当するものを1つ以上選択してください。該当するものがなければ追加してください。運営側でテーマの分類/タグ付けに利用します)- 言語- 実践手法- 入門解説- ライブラリ/フレームワーク- 言語処理系/開発ツール# 想定する聴衆/前提知識- Haskell の構文の雰囲気を知っている- 代数的データ型や再帰がわかる- unsafe って何かこわいと思っている人# 聴衆が得られるもの(目安: 100文字以内)- Haskell の発展的な型レベルプログラミングの知識- "unsafe" なエスケープハッチとの向き合い方- 型システムを活用したライブラリの設計指針# セッションの概要(目安: 800文字以内)TypeScript や Rust などの成功により、型システムはプログラミングを行う上でプログラムの正当性や安全性を担保する非常に強力なツールである、という認識は今や関数型プログラミングのコミュニティを大きく越え、ソフトウェアエンジニア一般にも大きく認知されるようになってきました。特に、言語の備える型システムが強力であるほど、様々な安全性や不変条件を型で表現できるようになり、実用性と安全性を両立しつつ言語を拡張するようなライブラリの実装が可能になります。このようなライブラリの実装は、「いかに危険なプログラムを表現できないようにするか」という営為であるのと同時に、「いかに本来はunsafeな**黒魔術**を型の裏に包んで見えなくするか」という課題に向き合うことでもあります。本講演では、フィールドを自由に増減できるレコードである「拡張可能レコード」の Haskell での実装を題材に、発展的な型システムの機能の活用・拡張方法や、`unsafePeformIO` などのエスケープハッチとの向き合い方、線型型による可変状態の局所化などについて学びます。他言語のユーザの皆さんに向けても、「unsafe は怖くない」ということ、むしろ「unsafeな **エスケープハッチの存在こそが、その言語の型システムを200%活用するために不可欠な真髄である**」というメッセージを持ち帰っていただけたらと思います。

Extensible recordsの実装を、まずナイーブなものからだんだんunsafeを使って部分的になんでもアリにしたかと思えばlinearityで制約付けをおこなうことによりさらにperformantなコードにしていくという高度なだけでなく極めて実用的でワクワクする内容だった。

# セッションのテーマ- 言語- 言語処理系/開発ツール# 想定する聴衆/前提知識- TLA+ に興味がある方- コンパイラに興味がある方TLA+ の事前知識は必要ありません。コンパイラについては、大学の講義で登場するような入門的な内容(e.g. 構文木、コード生成)を理解していることが望ましいです。# 聴衆が得られるもの以下の大まかな理解が得られる想定です:- TLA+/PlusCal の言語仕様- PlusCal から TLA+ へのコンパイルの仕組み- リッチな alt TLA+ の開発で生じる問題点と解決方法# セッションの概要TLA+ とは形式仕様記述言語であり、並行・分散システムの振る舞い(あるいはアルゴリズム)を曖昧なく記述できます。TLA+ で記述したアルゴリズムはモデル検査でき、デッドロックをはじめとするある種のバグを検出可能です。TLA+ は AWS や Azure でも採用事例があり、今後益々利用が拡大すると期待されます。そんな TLA+ ですが、一般のプログラミング言語とは大きく異なる形でアルゴリズムを記述する必要があり、活用の障壁となっています。その障壁の解決のため、TLA+ をターゲット言語とする言語 PlusCal が公式に開発されており、こちらの言語は疑似コードのような形でアルゴリズムを記述可能です。一方で、PlusCal は簡潔さを尊ぶため、逆に言うと言語機能がやや乏しいです。例えば、変数のシャドーイングがサポートされないため、大きなアルゴリズムの記述には注意を要します。そこで、上記の PlusCal の辛みを解決すべく、[最強の alt TLA+ として sanpou という言語を作ってみました](https://github.com/ajfAfg/sanpou)。sanpou は先述した変数のシャドーイングをはじめ、ラベルの自動付与や Hindley-Milner 型推論など、PlusCal には備わっていない多くの言語機能をサポートします。本セッションでは、sanpou の言語仕様や仕組みを解説します。sanpou を足がかりに、私たちが alt TLA+ に求める言語機能は何か、どこまで言語機能をリッチにできるか、TLA+ の未来をみなさまと議論できると幸いです。

弊ブログのファンボの方(!?)が自分の次に発表なさっておりウケた。 TLA+をコンパイルターゲットとした言語を作っていくと、薄目に見るとTLA+が機械語に見えるというアハ体験があったり、自分の発表の「言語を作るのは今も時期が良い」を図らずも実践していたので発表後にメッセージの厚みが出て嬉しいです。感謝。


色んな方々と関数型プログラミングのみならず様々な技術トピックについて久々に話しまくれて大変啓発的な時間でした。

ところでCMです。株式会社HERPは関数型まつり2026にスポンサーしてました。 弊社は現在Haskellなどといった関数型言語を積極採用しておりませんが、関数型パラダイムのような人間の所与でない(諸説)プログラミングテクニックにも大きな関心を持って日々エンジニアリングに取り組んだりプログラミング技法を研鑽している方々をオールウェイズ募集しています。

株式会社HERPが公開している、開発(Development) の求人一覧です

また株式会社ビットキー様と協賛でEffect-TSを採用するしないという軸で座談会をするらしいです。 基礎的な話を超えて採用するラインや活用方法など、エフェクトシステムのより実務的な内容について話が聞けるんじゃないかと、えー思っております。 枠が少ないのでお早めに。

# 💭 イベント概要 このイベントは、TypeScriptの関数型ライブラリ「Effect-TS」の導入からその先にある、「継続」と「撤退」のリアルな境界線を紐解く勉強会です! Effect-TSを採用するかどうかの明確な基準や、導入した後に直面するリアルな課題を議論してみませんか? 本イベントでは、Effect-TSを使い続けているHERP社と、苦渋の決断で撤退を選んだビットキー社の2社が登壇! それぞれが「なぜその判断に至ったのか」という経緯や開発の裏側をお届けします 🎤 登壇だけでなく、パネルトークやリアルタイムでのQ&Aセッションも実施します 💬 単なる技術の紹介...

この記事は業務時間中に書かれました。


  1. async/awaitはエフェクトシステムと言えなくもないし、generatorsも言えなくもない。(トラックしたい)エフェクトが非同期性や並行性に限った場合健全なエフェクトシステムではある、が、例外やIOなど起きるんでそんなことはない。 

  2. side-effectつってるんで当然意図したものではない! "Output(return type)のみが意図したoutcomeである"という値だけのナイーブな世界観に対してエフェクトシステムによる作用の表明があると思ってるで、俺は。