[obsidian] vault backup: 2025-08-18 15:10:38[
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build / build (push) Successful in 7m55s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Build / build (push) Successful in 7m55s
				
			This commit is contained in:
		@@ -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)
 | 
			
		||||
[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<T> = 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'}` 
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user