Upgrade to Pro — share decks privately, control downloads, hide ads and more …

なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri

なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri

関数型プログラミングの世界では「型」や「証明」が語られることがあります。
このセッションでは、副作用の分離、型、証明のつながりを3つのステップでたどります。
関数型まつりの他のセッションを「地図の上で」位置づけて聴けるようになるための手がかりになることを目指します。

Avatar for Takuma Kajikawa

Takuma Kajikawa

July 11, 2026

More Decks by Takuma Kajikawa

Other Decks in Programming

Transcript

  1. 梶川 琢馬 𝕏 @kajitack 株式会社 TechBowl VPoT TechTrain の開発 /

    メンター 普段は PHP や TypeScript で web アプリケーション開発 先月、オーストラリアのトライアスロンの大会に行ってました。 関数型まつりは初参加!コアスタッフもやってます! スライドは X で公開します x.com/kajitack 2/41
  2. TechTrain は関数型まつりの PR スポンサーです TechTrain Media のインタビュー記事で、関数型まつり 2026 を紹介しています 初心者か実務経験者かで、聴くべきセッションは違う

    今日の残りのセッション選びにそのまま使えます techtrain.dev/media/articles/9rtggtxrgl 座長 5 人が語る、このまつりに込めた思い 読んでから聴くと、セッションの見え方が変わります techtrain.dev/media/articles/pq682joc35i 4/41
  3. 関数型は、ドメインモデリングの 武器になる 代数的データ型、不変性、純粋関数 関数型の道具は、DDD の目標にそのまま効く 業務の言葉で型を書けば、設計とコードのズレは型エラーになる 不正な状態は型で表現させず、失敗は Result で網羅する 不変性で値を再現し、I/O

    を端に寄せてコアを純粋に保つ Scott Wlaschin『関数型ドメインモデリング ドメイン駆動設計とF#でソフトウェアの複雑さに立ち向かおう』(猪股健太郎 訳、アスキードワンゴ、2024) 11/41
  4. 型と副作用 型が語るのは「OrderInput を受け取り、Order を返す」ここまで 隠れた入力: DB 接続、メールサーバ、現在時刻 隠れた出力: DB の行、送信メール、ログ、例外

    隠れた入力と、隠れた出力。型はそのどちらも語らない function placeOrder(input: OrderInput): Order { const order = Order.create(input); repository.save(order); // DBに書き込む mailer.sendConfirmation(order); // メールを送る logger.info("order placed"); // ログを書く return order; } TypeScript 12/41
  5. 副作用を分離 決める(純粋)と書く(副作用)に分ける。「決める」はモックなしでテストできる // 決める: 入力から「何が起きたか」を作る純粋な関数 function decide(input: OrderInput, now: Date):

    OrderPlaced { const order = Order.create(input, now); return { order, events: [{ type: "OrderPlaced", orderId: order.id }] }; } // 書く: 決めた結果を解釈して I/O を実行する async function placeOrder(input: OrderInput): Promise<Order> { const { order, events } = decide(input, clock.now()); await repository.save(order); await publisher.publish(events); // メールとログは購読側へ return order; } TypeScript 13/41
  6. 関数型の始まりはラムダ計算 λx. x + 1 「x を受け取って x + 1

    を返す」 1930 年代に Church が定義した計算モデル 関数の定義と適用、それだけで全ての計算を表現できる 関数型プログラミングの数学的な基盤 Alonzo Church, "An Unsolvable Problem of Elementary Number Theory" (1936) https://doi.org/10.2307/2371045 16/41
  7. 入力から出力を作る。それ以外の意味が存在しない A -> B は「A を受け取って B を返す関数」の型 隠れた DB

    書き込みも、握りつぶされる例外もない シグネチャを読む = 関数の影響範囲を全て知る parse :: String -> Maybe Config -- Maybe Config = Config か「なし」 Haskell 18/41
  8. Curry-Howard対応 型 = 命題 プログラム = 証明 命題とは「A ならば B」のような、真偽が決まる主張のこと

    証明とは、決まった規則だけで命題を導いた手順のこと。手順だから、機械的に検査できる λ(x:A). x : A → A 「A を受け取ってそのまま返す関数」は、「A を仮定すると A が成り立つ」という証明と 同じ形 引数を受け取ることが仮定を置くことに、値を返すことが結論を導くことに対応する Philip Wadler, "Propositions as Types" (2015) https://homepages.inf.ed.ac.uk/wadler/papers/propositions-as-types/propositions-as-types.pdf 23/41
  9. 型と命題の対応 型(プログラミング) 命題(論理学) 型 A -> B 「A ならば B」

    直積型 (A, B) 「A かつ B」 直和型 Either A B (どちらか一方) 「A または B」 その型の値を実際に作れる 命題を証明できる 24/41
  10. では、副作用があると? どれも型は A -> B (A ならば B の証明)を名乗るのに、B の値を作らずに型検査を通る

    これが「偽の証明」。偽の証明が書ける体系では、どんな命題でも証明できてしまう 対応は、証明としての信用を失う B f(A a) { launchMissiles(); return null; } // 副作用 + null B g(A a) { while (true) {} } // 停止しない B h(A a) { throw new Error(); } // 例外 26/41
  11. だからFP言語は、副作用を型で管理する 問題 対処 言語の例 副作用 IO 型で明示 Haskell 例外、null Maybe

    / Result で型に表現 Haskell、Rust 停止しない 全域関数を強制 Lean、Agda(定理証明のための言語) IO String は「実行すると文字列を得る手順書」。組み立ては純粋なまま、実行を端に寄せる 「Haskell に副作用がない」のではなく、型で管理している 27/41
  12. 表現できる命題の範囲を広げると証明支援系 List Int は長さが分からない。 Vec 3 Int は長さがちょうど 3 だと型が保証する

    先頭要素を返す head の型が「長さ 1 以上」を要求すると、空リストへの head は実行前に 型エラーになる 型が「値」に依存できると、幅広い命題が型として書ける プログラムが仕様を満たすことを数学的に証明する世界が形式検証 形式検証をおこなう Lean、Agda、Coq など 30/41
  13. GitHub で最も使われる⾔語 上位 3 ⾔語の順位、2023 → 2025 1位 2位 3位

    TypeScript Python JavaScript 2023 2024 2025 2025/8 伸びているのは TypeScript だけではない 型付き⾔語のコントリビュータ増加率(前年⽐) Luau Typst TypeScript +194% +108% +66% 型付き言語が、 選ばれ始めている TypeScript は GitHub で最も使われる言語になった 伸びているのは TypeScript だけではなく、 型付き言語というカテゴリ全体 AI 支援開発が型付き言語を後押ししたと GitHub は分析している Cassidy Williams "Why AI is pushing developers toward typed languages" (GitHub Blog 2026) https://github.blog/ai-and-ml/llms/why-ai-is-pushing-developers-toward-typed-languages/ 36/41