From bd38b07724f65bc3d2110bba0937fbf44f61e069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Mon, 18 Aug 2025 15:10:38 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-08-18 15:10:38[ --- content/mimiumの型推論.md | 48 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/content/mimiumの型推論.md b/content/mimiumの型推論.md index cf6ac72c..658f8716 100644 --- a/content/mimiumの型推論.md +++ b/content/mimiumの型推論.md @@ -5,4 +5,50 @@ [[構造的部分型]]と[[単一化]]の組み合わせ方の参考になる -[erg/doc/JA/compiler/inference.md at main · erg-lang/erg · GitHub](https://github.com/erg-lang/erg/blob/main/doc/JA/compiler/inference.md) \ No newline at end of file +[erg/doc/JA/compiler/inference.md at main · erg-lang/erg · GitHub](https://github.com/erg-lang/erg/blob/main/doc/JA/compiler/inference.md) + + +## デフォルト型パラメーターの推論 + +[[mimiumのレコード型#レコード型を使った自動パラメータパック]] + +これをちゃんと推論したい + +```rust +fn foo(a,b=1.0,c=2.0){ + a+b+c +} +fn dsp(){ + { a = 4.0 .. } |> foo // should be 7.0 +} +``` + +試しにオプション型`Option = Some(T) | None`を`T?`と書くことにする + +`foo:{a:float,b:float?,c:float?}->float` + +関数内でランタイムチェックしてOKならこういう感じに展開できる + +```rust +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'}`