Products
For products, we have types τ:
- Binary
τ1×τ2
- Nullary
1 or unit
and expressions e:
Statics:
Γ⊢⟨⟩:1
Γ⊢e1:τ1,Γ⊢e2:τ2Γ⊢⟨e1,e2⟩:τ1×τ2
Γ⊢e:τ1×τ2Γ⊢e⋅1:τ1,e⋅2:τ2
Dynamics (two cases, lazy or eager):
lazy:
⟨e1,e2⟩val
end lazy
eager:
e1↦e′1⟨e1,e2⟩↦⟨e′1,e2⟩
e1 val,e2↦e′2⟨e1,e2⟩↦⟨e1,e′2⟩
e1 val,e2 val⟨e1,e2⟩val
end eager
e↦e′e⋅2↦e′⋅2
⟨e1,e2⟩val⟨e1,e2⟩⋅i↦ei
Sums
For sums, we have types τ:
- Binary Sum/Coproducts
τ1+τ2
- Nullary
0 or void
and expressions e:
case−−−−τe{1⋅x↪e1|2⋅x↪e2}orcase−−−−[τ](x.e1;x.e2)(e)
case−−−−{}orabort[τ]()
Note: abort doesn’t mean to abort!!!!!
Statics:
Γ⊢ei:τiΓ⊢i⋅ei:τ1+τ2
Γ⊢e:τ1+τ and Γ,x:τ1⊢e1:τ Γ,x:τ2⊢e2:τΓ⊢case−−−−τe{1⋅x↪e1|2⋅x↪e2}:τ
Γ⊢e:0Γ⊢case−−−−e{}:τ
Dynamics (two cases, lazy or eager):
lazy:
i⋅ei val
end lazy
eager:
ei↦e′ii⋅ei↦i⋅e′i
ei vali⋅ei val
end eager
e↦e′case−−−−τe{...}↦case−−−−e′{...}
i⋅ei valcase−−−−τi⋅ei{1⋅x↪e′1|2⋅x↪e′2}↦[ei/x]e′i
e↦e′case−−−−e{}↦case−−−−e′{}
Some Type Algebra
τ×1≅ττ1×(τ2×τ3)≅(τ1×τ2)×τ3τ1×τ2≅τ2×τ1τ+0≅ττ1+(τ2+τ3)≅(τ1+τ2)+τ3τ1+τ2≅τ2+τ1τ1×(τ2+τ3)≅(τ1×τ2)+(τ1×τ3)
Algebra about functions (using the arrow notation):
τ→(ρ1×ρ2)≅(τ→ρ1)×(τ→ρ2)τ→1≅1
Functions can also be written by exponential notation:
(ρ1×ρ2)τ≅ρτ1×ρτ21τ≅1
Something like the dual:
(τ1+τ2)→ρ≅(τ1→ρ)×(τ2→ρ)0→ρ≅1
In exponential notation:
ρτ1+τ2≅ρτ1×ρτ2ρ0≅1
Comments