Slide 1

Slide 1 text

部分型について探ってみよう TAPL読んでみたぜ (読んでるぜ) TAPL.ts

Slide 2

Slide 2 text

イントロ 自己紹介 name: PADAone occpation: フロントエンドエンジニア activity: オープンソースのドキュメント活動 Obsidian MDN Web Docs JavaScript Primer サバイバルTypeScript Zenn (非同期の本など) hobby: ジム/銭湯/サウナ 最近の活動 非同期特集 第2章

Slide 3

Slide 3 text

イベント告知 TAPLイベントはすでに45回を超えています! 現在は部分型の章(15章~)を輪読しています

Slide 4

Slide 4 text

本日の内容 部分型関係について(15章あたり)

Slide 5

Slide 5 text

目次 1. 型の種類 1. 基本的な型の種類 2. 部分型関係 1. 部分型関係とは 2. 包含関係として部分型関係 3. 集合としての型 4. 関数型の部分型関係 5. 関数型の部分型関係の説明(TAPL) 6. 関数型の部分型関係の解釈 7. 型強制意味論 3. 順序集合 1. 部分型関係と順序集合 2. Top型とBottom型 3. 束構造 4. TSの部分型束 4. 参考文献

Slide 6

Slide 6 text

1. 型の種類

Slide 7

Slide 7 text

基本的な型の種類 プログラミング言語では様々な型が存在しているが、 型はその特性から類別することができる https://en.wikipedia.org/wiki/Type_system より引用 型名 TypeScriptの相当する型 プリミティブ型、原子型, 基本 型… number , string , boolean 2つ組(pair)、組(tuple) [1, 2] , [1, "str", true] レコード(record) { fst: 1, snd: "str" } 単位型(unit)、リテラル型 null , 42 , "str" , true 交差型(intersection) A & B 合併型(union) A | B

Slide 8

Slide 8 text

2. 部分型関係

Slide 9

Slide 9 text

部分型関係とは 部分型関係とは、ある型 の項が別の型 の項 が期待されている文脈で安全に使用可能であると いうことを定める関係性のことで、 と表 記して「型 は型 の部分型である」と読み、 逆に「型 は型 の上位型である」とも読める 包摂規則 部分型関係は以下の包摂規則(subsumption)が大原則 として成り立つ 👉 が の部分型であるならば、 型の項 はすべ て 型の要素でもある 例として、より一般的な型である A, C と、より具 体的な型である B, D を比べると、より詳細な型の 方が部分型となる , が成り立つ type = { : number; }; // より一般的 type = { : number; : string; }; // より具体的 // A型が期待される文脈でB型の項を割り当てることができる const : = { : 42, : "st", }; const : = ; const : = { : 42, }; const b2: = ; // その逆はできない type = number; // より一般的 type = 42; // より具体的 // C型が期待される文脈でD型の項を割り当てることができる const : = 42; const : = ; const : = 42; const d2: = ; // その逆はできない S T S <: T S T T S ​ Γ ⊢ t <: T Γ ⊢ t <: S S <: T S T S t T B <: A C <: D A fst B fst snd b1 B fst snd a1 A b1 a2 A fst B a2 Property 'snd' is missing in type 'A' but required in ty C D d1 D c1 C d1 c2 C D c2 Type 'number' is not assignable to type '42'.

Slide 10

Slide 10 text

包含関係として部分型関係 部分型付け規則 部分型関係は以下のような「部分型付け規則 (subtyping rule)」に支配されている 反射律は、自己言及的な関係であり、任意の型 に 対して は自身の部分型であるということを示す 推移律は、部分型関係が推移的であること、つまり かつ なら であり、 は を介して の部分型であることが推移的に分かる 集合の包含関係は反射律と推移律を満たしており、部 分型関係は集合論的に解釈すると包含関係とみなせる 👉 TAPLではこのような解釈を「部分集合意味論」と 呼ぶ ​ ​ 反射律 S <: S 推移律 ​ S <: T S <: U U <: T (1) (2) S S A <: B B <: C A <: C A B C

Slide 11

Slide 11 text

集合として型をみなすを直感的に理解できる 型は値の集まり(集合) 和集合と共通部分

Slide 12

Slide 12 text

関数型の部分型関係 関数型 ( ) と ( ) に部分型 関係 ( が の部分型)があるとき、以 下のような部分型付け規則が成り立っている 引数の型については関数型の部分型関係と逆方向 なので反変(contravariant) 戻り値の型については関数型の部分型関係と同方 向なので共変(covariant) type < , > = [ ] extends [ ] ? true : false; type = ( : number) => 42; type = ( : 42) => number; type = < , >; // true type = < , >; // false // => S1 <: S2 // S2が期待される文脈でS1を使用することができる S1 P1 → R1 S2 P2 → R2 S1 <: S2 S1 S2 ​ P1 → R1 <: P2 → R2 P1 :> P2 R1 <: R2 IsSubtypeOf Fst Snd Fst Snd S1 x S2 x S1IsSubtypeOfS2 IsSubtypeOf S1 S2 S2IsSubtypeOfS1 IsSubtypeOf S2 S1

Slide 13

Slide 13 text

TAPLではこんな感じに説明されている

Slide 14

Slide 14 text

関数型の部分型関係の解釈 関数型はパイプに置き換えることで理解できる

Slide 15

Slide 15 text

部分型の意味論 型強制意味論 「部分集合意味論」は直感的に理解しやすいが、性能 上の理由から悪影響がでる場合がある(例えば、整数 値型 と浮動小数点数型 を部分型関係と内 部のデータ表現の違いなど) そこで部分集合意味論に代わる別の意味論として「型 強制意味論」を用いる。部分型付け自体を実行時(ラ ンタイム)で型強制に置き換えることで「コンパイル時 に消去して」 、部分型付け自体を含まない低水準な言 語へと置き換える。 意味論的部分型 Giuseppe Castagna 氏による Semantic Subtyping の 研究 https://blog.roblox.com/2022/11/semantic-subtyping-luau/ https://elixir-lang.org/blog/2022/10/05/my-future-with-elixir-set-theoretic- types/ int float

Slide 16

Slide 16 text

3. 順序集合

Slide 17

Slide 17 text

部分型関係と順序集合 部分型関係が満たす代数法則 部分型による順序関係( )は以下の代数法則を満たす 反射律 (reflexive law) 推移律 (transitive law) 反対称律 (asymmetric law) 半順序集合 順序関係を持つ集合は一般に順序集合と呼ばれ、いく つかの種類がある。 この三つの代数法則を満たす集 合は半順序集合(pre-order set)と呼ばれる 全順序集合 c a b 半順序集合 f e g h 前順序集合 同値要素 k i j l m 部分型関係はいくつかの代数的構造を作る ≺ a ≺ a (∀a ∈ S) a ≺ b ∧ b ≺ c ⇒ a ≺ c (∀a, b, c ∈ S) a ≺ b ∧ b ≺ a ⇒ a = b (∀a, b ∈ S)

Slide 18

Slide 18 text

Top型とBottom型 Top型 すべての項を持つ型はTop型と呼ばれ、部分型関係で は一番天井にある型となる。TypeScriptでは unknown 型が相当する。 <: <: <: <: a e c b 順序集合内では、このような要素を最大元(greatest element)と呼ぶ Bottom型 項がなにもない型は空型と呼ばれ、Bottom型やBot型 などとも呼ばれる。部分型関係では一番底にある型と なる。TypeScriptでは never 型が相当する。 <: <: <: <: a e c b 順序集合内では、このような要素は最小元(lowest element)と呼ぶ

Slide 19

Slide 19 text

束構造 束とは 集合内の任意の二元部分集合が一意な最小上界と最大 下界を持つような半順序集合は束(lattice)と呼ばれる 特殊な構造を作ります Top(⊤) Left Right Bottom(⊥) unknown never { } null undefined ※ "strictNullChecks": true 部分型束 部分型関係が定める束構造を Subtype lattice (部分型 束)と呼びます https://typescriptbook.jp/reference/values-types- variables/mental-model-of-types 特殊な半順序集合

Slide 20

Slide 20 text

TypeScriptの部分型束 Primitive Object wrapper type Unit type Collective type number string boolean bigint symbol undefined null number literal string literal boolean literal bigint literal unique symbol Number String Boolean BigInt Symbol unknown never void { } Object User Defined Types Constructor Function Types Function Tuple Array readonly Tuple ReadonlyArray より具体的な束構造

Slide 21

Slide 21 text

参考文献 書籍 型システム入門 プログラミング言語と型の理論 復刊 束論 論文 Stephen Dolan, "Algebraic Subtyping" 記事 順序集合や束などに関する基本的な概念の説明 https://www.cs-study.com/koga/lattice/explanatio ns_on_concepts_of_posets.html 集合としての型 - An Introduction to Elm https://guide.elm-lang.jp/appendix/types_as_set s.html

Slide 22

Slide 22 text

END ご清聴ありがとうございました