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

部分型について探ってみよう

 部分型について探ってみよう

TAPL.tsによるTAPLイベント「カワるガワるTAPLカタるヨる」でのPADAoneの発表スライドです。
👉 https://taplts.connpass.com/event/320294/

PADAone

July 25, 2024
Tweet

Other Decks in Programming

Transcript

  1. イントロ 自己紹介 name: PADAone occpation: フロントエンドエンジニア activity: オープンソースのドキュメント活動 Obsidian MDN

    Web Docs JavaScript Primer サバイバルTypeScript Zenn (非同期の本など) hobby: ジム/銭湯/サウナ 最近の活動 非同期特集 第2章
  2. 目次 1. 型の種類 1. 基本的な型の種類 2. 部分型関係 1. 部分型関係とは 2.

    包含関係として部分型関係 3. 集合としての型 4. 関数型の部分型関係 5. 関数型の部分型関係の説明(TAPL) 6. 関数型の部分型関係の解釈 7. 型強制意味論 3. 順序集合 1. 部分型関係と順序集合 2. Top型とBottom型 3. 束構造 4. TSの部分型束 4. 参考文献
  3. 基本的な型の種類 プログラミング言語では様々な型が存在しているが、 型はその特性から類別することができる 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
  4. 部分型関係とは 部分型関係とは、ある型 の項が別の型 の項 が期待されている文脈で安全に使用可能であると いうことを定める関係性のことで、 と表 記して「型 は型 の部分型である」と読み、

    逆に「型 は型 の上位型である」とも読める 包摂規則 部分型関係は以下の包摂規則(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'.
  5. 包含関係として部分型関係 部分型付け規則 部分型関係は以下のような「部分型付け規則 (subtyping rule)」に支配されている 反射律は、自己言及的な関係であり、任意の型 に 対して は自身の部分型であるということを示す 推移律は、部分型関係が推移的であること、つまり

    かつ なら であり、 は を介して の部分型であることが推移的に分かる 集合の包含関係は反射律と推移律を満たしており、部 分型関係は集合論的に解釈すると包含関係とみなせる 👉 TAPLではこのような解釈を「部分集合意味論」と 呼ぶ ​ ​ 反射律 S <: S 推移律 ​ S <: T S <: U U <: T (1) (2) S S A <: B B <: C A <: C A B C
  6. 関数型の部分型関係 関数型 ( ) と ( ) に部分型 関係 (

    が の部分型)があるとき、以 下のような部分型付け規則が成り立っている 引数の型については関数型の部分型関係と逆方向 なので反変(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
  7. 部分型の意味論 型強制意味論 「部分集合意味論」は直感的に理解しやすいが、性能 上の理由から悪影響がでる場合がある(例えば、整数 値型 と浮動小数点数型 を部分型関係と内 部のデータ表現の違いなど) そこで部分集合意味論に代わる別の意味論として「型 強制意味論」を用いる。部分型付け自体を実行時(ラ

    ンタイム)で型強制に置き換えることで「コンパイル時 に消去して」 、部分型付け自体を含まない低水準な言 語へと置き換える。 意味論的部分型 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
  8. 部分型関係と順序集合 部分型関係が満たす代数法則 部分型による順序関係( )は以下の代数法則を満たす 反射律 (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)
  9. Top型とBottom型 Top型 すべての項を持つ型はTop型と呼ばれ、部分型関係で は一番天井にある型となる。TypeScriptでは unknown 型が相当する。 <: <: <: <:

    a e c b 順序集合内では、このような要素を最大元(greatest element)と呼ぶ Bottom型 項がなにもない型は空型と呼ばれ、Bottom型やBot型 などとも呼ばれる。部分型関係では一番底にある型と なる。TypeScriptでは never 型が相当する。 <: <: <: <: a e c b 順序集合内では、このような要素は最小元(lowest element)と呼ぶ
  10. 束構造 束とは 集合内の任意の二元部分集合が一意な最小上界と最大 下界を持つような半順序集合は束(lattice)と呼ばれる 特殊な構造を作ります Top(⊤) Left Right Bottom(⊥) unknown

    never { } null undefined ※ "strictNullChecks": true 部分型束 部分型関係が定める束構造を Subtype lattice (部分型 束)と呼びます https://typescriptbook.jp/reference/values-types- variables/mental-model-of-types 特殊な半順序集合
  11. 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 より具体的な束構造
  12. 参考文献 書籍 型システム入門 プログラミング言語と型の理論 復刊 束論 論文 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