Files
quartz-research-note/content/mimiumの型推論.md
松浦 知也 Matsuura Tomoya bd38b07724
All checks were successful
Build / build (push) Successful in 7m55s
[obsidian] vault backup: 2025-08-18 15:10:38[
2025-08-18 15:10:38 +09:00

1.4 KiB

型推論

Ergのドキュメントが参考になる

構造的部分型単一化の組み合わせ方の参考になる

erg/doc/JA/compiler/inference.md at main · erg-lang/erg · GitHub

デフォルト型パラメーターの推論

mimiumのレコード型#レコード型を使った自動パラメータパック

これをちゃんと推論したい

fn foo(a,b=1.0,c=2.0){
  a+b+c
}
fn dsp(){
  { a = 4.0 .. } |> foo // should be 7.0
}

試しにオプション型Option<T> = Some(T) | NoneT?と書くことにする

foo:{a:float,b:float?,c:float?}->float

関数内でランタイムチェックしてOKならこういう感じに展開できる

fn foo(a:float,b:float?,c:float?){
   let b = b.unwrap_or(1.0);
   let c = c.unwrap_or(2.0);
   a+b+c
}
//bだけがunwrapされ、cはdefault値になる
fn dsp(){
  foo({ a = 4.0 , b = 3.0 }) // should be 9.0
}

そもそもSubtypingがきちんと働けばImcompleteRecord({..})とか書く必要ないっぽい

ランタイムチェックをなくそうと思うと、結局静的ポリモーフィズムになる

{a:float, b:float}{a:float, b:float?, c:float?}

float?はfloatとNoneいずれも受け入れられる。float?はfloatのサブタイプである。

float? <: float

U' <: Uならば{a:T,b:U,c:V} <: {a:T,b:U'}