2024-06「キャンプΔ」.
キャンプΔ
ツイートまとめ定期
関数型言語の実装: Union Typeの実装
- 社の勉強会で知ったのですが、関数の引数は反変らしいです。
- TypeScript の変性(共変・反変)を 5 分で理解する の例がわかりやすかったです
- 直しました commit
- 今まで
(int) -> int
の関数に(any) -> int
を代入できてしまっていましたね
- 今まで
// 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
のsubtypeat <: bt
1 | 3 <: (1 | 2) | 3
とかのネストする場合があるのでUnity Typeは型評価時にflattenしないといけなかったです
- Generic Boundsを作っています
((fn (x : (a <: atom)) x) :a)
と書くとx
はatom
のsubtype(:a
とか)を受け取れるようになります- 型変数がある時はsubtypeかのチェックはスキップされますが, boundsがあると
arg_ty <: bound_ty
がチェックされます- これで良いかはわからない
生活
同期とオートキャンプ場で泊まりました。
- 勝浦担々麺
娯楽
- RAS
モルック
— か (@w4k4.me) Jun 20, 2024 at 15:22
[image or embed]
- 桃香セット
ガルクラの聖地巡礼をしました
— か (@w4k4.me) May 29, 2024 at 12:23
[image or embed]
- Dead Pop Fes 2024
— かまちょ🌖🍀🍢 (@kmch000) June 29, 2024