Posted on

キャンプΔ

ツイートまとめ定期

関数型言語の実装: Union Typeの実装

// User に Admin を代入できる
type User = { name: string }
// Admin は User の subtype
type Admin = User & { permissions: string[] }

// 関数の返り値は共変
const fn1: () => User = () => admin
// 関数の引数は反変
const fn3: (arg: User) => void = (arg: Admin) => console.log(arg.name, arg.permissions);
  • Union Typeを作りました
    • (let x : (| int atom) 1) みたいに書けます(パーサーの実装が面倒くさいので前置になっています)
    • any <: any | int にならなかったので any は例外で絶対にsuper typeになるように直しました
    • Literal Typeを作り, リテラルはLiteral Typeに推論されるようになりました
      • 1 <: 1 | 2 とかが出来ます
    • Union Type同士 a, b の部分型かの比較は↓とかになるんですかね
      • a 要素型 $\subset$ b の要素型 または b の全ての要素型 bt について a の要素型 at のsubtype at <: bt
    • 1 | 3 <: (1 | 2) | 3 とかのネストする場合があるのでUnity Typeは型評価時にflattenしないといけなかったです
  • Generic Boundsを作っています
    • ((fn (x : (a <: atom)) x) :a) と書くと xatom のsubtype(:a とか)を受け取れるようになります
    • 型変数がある時はsubtypeかのチェックはスキップされますが, boundsがあると arg_ty <: bound_ty がチェックされます
      • これで良いかはわからない

生活

同期とオートキャンプ場で泊まりました。

200

200

  • 勝浦担々麺

200

娯楽

  • RAS

モルック

[image or embed]

— か (@w4k4.me) Jun 20, 2024 at 15:22
  • 桃香セット

ガルクラの聖地巡礼をしました

[image or embed]

— か (@w4k4.me) May 29, 2024 at 12:23