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

Welcome to the "Parametricity" 🏙 − Generic だけど...

Welcome to the "Parametricity" 🏙 − Generic だけど Specific な䞖界 −

このスラむドは、2026/07/12「関数型た぀り 2026」で発衚したものです。

cf. https://fortee.jp/2026fp-matsuri/proposal/310a9a71-f65b-4ad1-a6d6-81878923cfb3

Avatar for TAKASE Kazuyuki

TAKASE Kazuyuki

July 12, 2026

More Decks by TAKASE Kazuyuki

Other Decks in Programming

Transcript

  1. Welcome to the "Parametricity" 🏙 − Generic だけど Specific な䞖界

    − #関数型た぀り 2026 — @Guvalif (TAKASE Kazuyuki)
  2. 自己玹介 - 高瀬 和之 (TAKASE Kazuyuki) 𝕏@Guvalif 䜙談) ScalaMatsuri 2020

    ぶりの登壇です 💪 Profile { works = [ "IoT ゚ンゞニア", "フロント゚ンド・゚ンゞニア", "開発人事", "TechPM (← 珟職)", "゚ンゞニア育成 (← 耇業)" ], memo = "関数型 XXX を名乗りがち 😗" }
  3. 倚盞型のモチベヌション (1) 配列に察する head 関数を考える もし 倚盞型が無い 堎合、次のようなこずが起こる const headN:

    (_: number[]) => number | undefined = (xs) => xs.at(0); const headS: (_: string[]) => string | undefined = (xs) => xs.at(0); const headB: (_: boolean[]) => boolean | undefined = (xs) => xs.at(0); // 以䞋、同䞀な実装であっおも各型ごずに区別しなければならない 😇
  4. 倚盞型のモチベヌション (2) 倚盞型がある 堎合、次のように蚘述できる const head: <T>(_: T[]) => T

    | undefined = (xs) => xs.at(0); head([ 1, 2, 3 ]); // 1 head([ 'a', 'b', 'c' ]); // 'a' head([ true, false, true ]); // true head([]); // undefined // どのような型 `T` に察しおも、(型安党性を保っお) 同䞀な実装を甚いるこずができる 🙆‍♂
  5. 前提 本資料では、以䞋の前提のもず数孊的なモデルを考えおいく (玠朎な) 型 を 集合 ずみなす 玔粋な関数のみを考慮する 䞍動点挔算子 (いわゆる

    Y or Z コンビネヌタ) は考慮しない type F<X, Y> = (_: (_: X) => Y) => (_: X) => Y; type G<X, Y> = (_: G<X, Y> ) => (_: X) => Y; const Z = <X, Y>(f: F<X, Y>) => ( (g: G<X, Y>) => f((x) => g(g)(x)) ) ( (g: G<X, Y>) => f((x) => g(g)(x)) );
  6. 導入倚盞型の衚珟 倚盞型で型付けされた倀は (チルダ) で区別する。このずき 1. 通垞の TypeScript における型衚珟 ∗ ~

    ​ ​ ​ ​ h ~ h ~ ​ h ~ A : : : ⟹T⟩(_ : T[]) ⇒ T ∣ undefined ⟹T⟩. T[] ⇒ T ∣ undefined ⟹A/T⟩. A[] ⇒ A ∣ undefined (1) (2) (3)
  7. 導入倚盞型の衚珟 倚盞型で型付けされた倀は (チルダ) で区別する。このずき 1. 通垞の TypeScript における型衚珟 2. 匕数を省力した型衚珟

    (本資料では䞀貫しおこの型衚珟を採甚) ∗ ~ ​ ​ ​ ​ h ~ h ~ ​ h ~ A : : : ⟹T⟩(_ : T[]) ⇒ T ∣ undefined ⟹T⟩. T[] ⇒ T ∣ undefined ⟹A/T⟩. A[] ⇒ A ∣ undefined (1) (2) (3)
  8. 導入倚盞型の衚珟 倚盞型で型付けされた倀は (チルダ) で区別する。このずき 2. 匕数を省力した型衚珟 (本資料では䞀貫しおこの型衚珟を採甚) 3. ある型 A

    による具䜓化 ∗ ~ ​ ​ ​ ​ h ~ h ~ ​ h ~ A : : : ⟹T⟩(_ : T[]) ⇒ T ∣ undefined ⟹T⟩. T[] ⇒ T ∣ undefined ⟹A/T⟩. A[] ⇒ A ∣ undefined (1) (2) (3) ※ 厳密には、具䜓化した時点で型パラメヌタ <T> は消去されたす ( <A/T> は芖芚的区別 )
  9. 怜蚎倚盞型を 集合 でモデル化する 🀔 型を集合ずみなすこずは玠朎だが、(e.g. boolean = ) ある型 T

    ごずに分岐する実装 を排陀しきれない e.g. を考える 型パラメヌタ が取れるこず を、 宇宙 に属する 任意の集合 に察する操䜜 ずしお解釈する 関数の型 を、配眮集合 ずしお解釈する ここで、ある型 による具䜓化 は、恒等関数以倖も含みうる {true, false} ⟹T⟩. T ⇒ T ⟹T⟩ U T T ⇒ T TT A AA
  10. 方針倚盞型を 関係 でモデル化し、制玄を匷める そもそも "関係" ずは デカルト積 の郚分集合 のこず ゜フトりェア・゚ンゞニア的には、

    2 Tuple の集たりのこず 本資料では、関係を考えるずき で囲っお衚す は、 の郚分集合であるこずを衚す A × B [[ X ]] : A ⟷ R B [[ ]] A ​ ⟷ R B A × B
  11. 恒等関係 型を関係に持ち䞊げる際の、自明な䟋のひず぀ e.g. の持ち䞊げ [[ I ​ ]] : T

    T ​ ⟷ R T = {(t, t) ∣ t ∈ T} ≅ T boolean ​ ​ ​ [[ I ​ ]] boolean = = = ≅ {(t, t) ∣ t ∈ boolean} {(t, t) ∣ t ∈ {true, false}} {(true, true), (false, false)} boolean
  12. 恒等関係 型を関係に持ち䞊げる際の、自明な䟋のひず぀ e.g. の持ち䞊げ [[ I ​ ]] : T

    T ​ ⟷ R T = {(t, t) ∣ t ∈ T} ≅ T boolean ​ ​ ​ [[ I ​ ]] boolean = = = ≅ {(t, t) ∣ t ∈ boolean} {(t, t) ∣ t ∈ {true, false}} {(true, true), (false, false)} boolean
  13. 恒等関係 型を関係に持ち䞊げる際の、自明な䟋のひず぀ e.g. の持ち䞊げ [[ I ​ ]] : T

    T ​ ⟷ R T = {(t, t) ∣ t ∈ T} ≅ T boolean ​ ​ ​ [[ I ​ ]] boolean = = = ≅ {(t, t) ∣ t ∈ boolean} {(t, t) ∣ t ∈ {true, false}} {(true, true), (false, false)} boolean
  14. 恒等関係 型を関係に持ち䞊げる際の、自明な䟋のひず぀ e.g. の持ち䞊げ [[ I ​ ]] : T

    T ​ ⟷ R T = {(t, t) ∣ t ∈ T} ≅ T boolean ​ ​ ​ [[ I ​ ]] boolean = = = ≅ {(t, t) ∣ t ∈ boolean} {(t, t) ∣ t ∈ {true, false}} {(true, true), (false, false)} boolean
  15. 関係ずしおの関数 関数 は、関係 に持ち䞊げるこずができる e.g. not 関数 の持ち䞊げ f :

    X ⇒ Y [[ f ]] [[ f ]] : X ​ ⟷ R Y = {(x, f(x)) ∣ x ∈ X} ¬ : boolean ⇒ boolean ​ ​ ​ [[ ¬ ]] = = = {(x, ¬(x)) ∣ x ∈ boolean} {(x, ¬(x)) ∣ x ∈ {true, false}} {(true, false), (false, true)}
  16. 関係ずしおの関数 関数 は、関係 に持ち䞊げるこずができる e.g. not 関数 の持ち䞊げ f :

    X ⇒ Y [[ f ]] [[ f ]] : X ​ ⟷ R Y = {(x, f(x)) ∣ x ∈ X} ¬ : boolean ⇒ boolean ​ ​ ​ [[ ¬ ]] = = = {(x, ¬(x)) ∣ x ∈ boolean} {(x, ¬(x)) ∣ x ∈ {true, false}} {(true, false), (false, true)}
  17. 関係ずしおの関数 関数 は、関係 に持ち䞊げるこずができる e.g. not 関数 の持ち䞊げ f :

    X ⇒ Y [[ f ]] [[ f ]] : X ​ ⟷ R Y = {(x, f(x)) ∣ x ∈ X} ¬ : boolean ⇒ boolean ​ ​ ​ [[ ¬ ]] = = = {(x, ¬(x)) ∣ x ∈ boolean} {(x, ¬(x)) ∣ x ∈ {true, false}} {(true, false), (false, true)}
  18. メモ 📝関係の衚珟力 関数 の関係ぞの持ち䞊げ は、 1 ぀の入力に察しお 1 ぀の出力を持぀衚珟 に限定される

    䞀方、 関係 は の任意の郚分集合なので、 1 ぀の入力に察しお耇数の出力を持぀衚珟 も蚱容できる f : X ⇒ Y [[ f ]] X × Y
  19. メモ 📝関係の衚珟力 関数 の関係ぞの持ち䞊げ は、 1 ぀の入力に察しお 1 ぀の出力を持぀衚珟 に限定される

    䞀方、 関係 は の任意の郚分集合なので、 1 ぀の入力に察しお耇数の出力を持぀衚珟 も蚱容できる e.g. 平方根の関係 に぀いお f : X ⇒ Y [[ f ]] X × Y [[ S ]] = {(x, y) ∣ y = 2 x} (4, 2) ∈ [[ S ]] ∧ (4, −2) ∈ [[ S ]]
  20. 関数関係 (1) 2 ぀の関係 ず を甚いお、 2 Tuple の各芁玠が関数 ずなるような関係を定矩できる

    [[ X ]] : X ​ ⟷ R X′ [[ Y ]] : Y ​ ⟷ R Y′ [[ X ]] ​ R [[ Y ]] : X ⇒ Y ​ ⟷ R X ⇒ Y ′ ′ {(f, f ) ∣ ′ for all (x, x ) ∈ ′ [[ X ]], (f(x), f (x )) ∈ ′ ′ [[ Y ]]} ※ "関係" を入出力にずる関数ではなく、あくたでも 2 Tuple の集たりであるこずに泚意
  21. 関数関係 (2) 具䜓䟋ずしお、 を考えおみる 【 関数関係が満たすべき条件 】 [[ I ​

    ]] ​ boolean R [[ I ​ ]] 0∣1 ​ ​ ​ ​ for all ( ​ ) x=x′ ​ x, x′ ( ​ ) f(x)=f (x ) ′ ′ ​ f(x), f (x ) ′ ′ ∈ ∈ [[ I ​ ]], boolean [[ I ​ ]] 0∣1 ※ 恒等関係に含たれる 2 Tuple は、垞に第 1 芁玠ず第 2 芁玠が等しいため
  22. 関数関係 (2) 具䜓䟋ずしお、 を考えおみる 【 関数関係が満たすべき条件 】 → 関数の倖延性から、 を満たす

    2 Tuple のみ考えれば良い [[ I ​ ]] ​ boolean R [[ I ​ ]] 0∣1 ​ ​ ​ ​ for all ( ​ ) x=x′ ​ x, x′ ( ​ ) f(x)=f (x ) ′ ′ ​ f(x), f (x ) ′ ′ ∈ ∈ [[ I ​ ]], boolean [[ I ​ ]] 0∣1 f = f′ ※ 恒等関係に含たれる 2 Tuple は、垞に第 1 芁玠ず第 2 芁玠が等しいため
  23. 関数関係 (3) その䞊で、 関数の型 の倀 をすべお列挙する boolean ⇒ 0∣1 const

    c0: (_: boolean) => 0|1 = (_) => 0; const c1: (_: boolean) => 0|1 = (_) => 1; const n: (_: boolean) => 0|1 = (x) => Number(x) as 0|1; const u: (_: boolean) => 0|1 = (x) => Number(!x) as 0|1;
  24. 党称関係 (1) を、関係 を匕数にずり、関係を返す関数ずする その䞊で、関係 に぀いお 党称量化 するこずを考える ここで、 は

    X で添字づけられた集たり は X' で添字づけられた集たりを意味し、 X ず X' を型で考えるず、 倚盞型で型付けされた倀 ずみなせる F([[ X ]]) [[ X ]] [[ X ]] {( ​ , ​ ) ∣ f ~ f ~′ for all [[ X ]] : X ​ ⟷ R X , ( ​ ​ , ​ ​ ) ∈ ′ f ~ X f ~′ X′ F([[ X ]])} ​ f ~ ​ f ~′
  25. 党称関係 (1) を、関係 を匕数にずり、関係を返す関数ずする その䞊で、関係 に぀いお 党称量化 するこずを考える ここで、 は

    X で添字づけられた集たり は X' で添字づけられた集たりを意味し、 X ず X' を型で考えるず、 倚盞型で型付けされた倀 ずみなせる → で衚し、倚盞型の関係ぞの持ち䞊げずみなす F([[ X ]]) [[ X ]] [[ X ]] {( ​ , ​ ) ∣ f ~ f ~′ for all [[ X ]] : X ​ ⟷ R X , ( ​ ​ , ​ ​ ) ∈ ′ f ~ X f ~′ X′ F([[ X ]])} ​ f ~ ​ f ~′ ⟹[[ X ]]⟩. F([[ X ]])
  26. 党称関係 (2) 具䜓䟋ずしお、 を考えおみる 【 党称関係が満たすべき条件 】 ここで、どのような X ず

    X' に察しおも、 を考慮する必芁がある → 無理 😇 ⟹[[ X ]]⟩. [[ X ]] ​ ​ for all [[ X ]] : X ​ X , ⟷ R ′ ( ​ ​ , ​ ​ ) ∈ [[ X ]] f ~ X f ~′ X′ X ​ ⟷ R X = ′ ∅ ⊆ X × X′
  27. Parametricity 倚盞型を持぀型システムを考える ある倀 の型 から、垰玍的に導出できる 関係 は、 を満たす 【 簡単な具䜓䟋

    】 に関しお、 が成り立぀ t T [[ T ]] (t, t) ∈ [[ T ]] true : boolean (true, true) ∈ [[ I ​ ]] boolean ※ 参考文献における蚘述は "閉じた項" ですが、型環境を適切に考慮すれば解消可胜です
  28. 実際に詊しおみる (1) (の型) から、 ずいう関係を 垰玍的に導出した䞊で、満たすべき条件を考える 【 関係が満たすべき条件 】 ​

    : f ~ ⟹T⟩. T ⇒ T ⟹[[ T ]]⟩. [[ T ]] ​ R [[ T ]] ​ ​ ​ ​ for all for all [[ T ]] (t, t ) ′ ( ​ ​ (t), ​ (t )) f ~ T f ~ T′ ′ : ∈ ∈ T ​ T , ⟷ R ′ [[ T ]], [[ T ]]
  29. 実際に詊しおみる (1) (の型) から、 ずいう関係を 垰玍的に導出した䞊で、満たすべき条件を考える 【 関係が満たすべき条件 】 ​

    : f ~ ⟹T⟩. T ⇒ T ⟹[[ T ]]⟩. [[ T ]] ​ R [[ T ]] ​ ​ ​ ​ for all for all [[ T ]] (t, t ) ′ ( ​ ​ (t), ​ (t )) f ~ T f ~ T′ ′ : ∈ ∈ T ​ T , ⟷ R ′ [[ T ]], [[ T ]]
  30. 実際に詊しおみる (1) (の型) から、 ずいう関係を 垰玍的に導出した䞊で、満たすべき条件を考える 【 関係が満たすべき条件 】 ​

    : f ~ ⟹T⟩. T ⇒ T ⟹[[ T ]]⟩. [[ T ]] ​ R [[ T ]] ​ ​ ​ ​ for all for all [[ T ]] (t, t ) ′ ( ​ ​ (t), ​ (t )) f ~ T f ~ T′ ′ : ∈ ∈ T ​ T , ⟷ R ′ [[ T ]], [[ T ]]
  31. 実際に詊しおみる (2) の郚分集合ずしお、関数の持ち䞊げ を 任意にずっおみる T ​ ⟷ R T′

    [[ g : T ⇒ T ]] ′ ​ ​ ​ ​ for all for all [[ g ]] (t, t ) ′ ( ​ ​ (t), ​ (t )) f ~ T f ~ T′ ′ : ∈ ∈ T ​ T , ⟷ R ′ [[ g ]], [[ g ]]
  32. 実際に詊しおみる (3) 関数の持ち䞊げ は、 を満たす 2 Tuple のみ持぀ので [[ g

    ]] (t, g(t)) ​ ​ ​ ​ for all for all [[ g ]] (t, ​ ) g(t) ​ t′ ( ​ ​ (t), ​ ) f ~ T g( ​ ​ (t)) f ~ T ​ ​ (t ) f ~ T′ ′ : ∈ ∈ T ​ T , ⟷ R ′ [[ g ]], [[ g ]]
  33. 関数関係ふたたび (1) 2 ぀の関係 ず を甚いお、 2 Tuple の各芁玠が関数ずなるような関係を定矩できる [[

    X ]] : X ​ ⟷ R X′ [[ Y ]] : Y ​ ⟷ R Y′ [[ X ]] ​ R [[ Y ]] : X ⇒ Y ​ ⟷ R X ⇒ Y ′ ′ {(f, f ) ∣ ′ for all (x, x ) ∈ ′ [[ X ]], (f(x), f (x )) ∈ ′ ′ [[ Y ]]}
  34. たずめ 関数関係 により、 可換図匏 が埗られる 党称関係 により、 自然倉換 が埗られる これより、

    倚盞関数は自然倉換 であるこずもわかる 【 参考文献 】 『Theorems for free !』by Philip Wadler 『型システム入門 - プログラミング蚀語ず型の理論』by オヌム瀟