開啟主選單
首頁
隨機
登入
設定
關於Tan Kian-ting的維基
免責聲明
Tan Kian-ting的維基
搜尋
玩具語言的型別推理原則
語言
監視
編輯
於 2022年3月3日 (四) 00:33 由
Tankianting
(
討論
|
貢獻
)
所做的修訂
(
差異
)
←上個修訂
|
最新修訂
(
差異
) |
下個修訂→
(
差異
)
A
∈
{
I
n
t
,
B
o
o
l
,
F
l
o
,
S
t
r
i
n
g
}
{\displaystyle A\in {\{Int,Bool,Flo,String\}}}
n
:
A
{\displaystyle {\frac {}{n:A}}}
let
x
:
A
=
y
y
:
B
b
e
l
o
n
g
T
o
(
B
,
A
)
x
:
B
{\displaystyle {\frac {{\textbf {let}}~x:A=y\qquad {y:B}\qquad {belongTo(B,A)}}{x:B}}}
let
A
∈
∗
b
e
l
o
n
g
(
A
,
A
)
{\displaystyle {\frac {{\textbf {let}}~A\in *}{belong(A,A)}}}
T
i
,
S
∈
∗
i
=
0
,
1
,
2
,
.
.
.
,
n
∀
j
∀
k
(
(
j
≠
k
)
∧
(
j
,
k
∈
i
)
→
n
a
m
e
j
≠
n
a
m
e
k
)
typedef
S
=
struct
(
i
t
e
m
0
:
T
0
,
…
,
i
t
e
m
n
:
T
n
)
x
:
S
x
:
S
T
R
U
C
T
(
n
a
m
e
0
:
T
0
,
.
.
.
,
n
a
m
e
n
:
T
n
)
{\displaystyle {\frac {T_{i},S\in {*}\qquad i=0,1,2,...,n\qquad {\forall j\forall k(~(j\neq {k})~\land ~(j,k\in {i})\rightarrow name_{j}\neq name_{k})}\qquad {{\textbf {typedef}}~S={\textbf {struct}}(item_{0}:T_{0},\dots ,item_{n}:T_{n})}\qquad {x:S}}{x:STRUCT(name_{0}:T_{0},...,name_{n}:T_{n})}}}
x
:
S
T
R
U
C
T
(
n
a
m
e
0
:
T
0
,
.
.
.
,
n
a
m
e
n
:
T
n
)
i
=
0
,
1
,
…
,
n
x
.
i
t
e
m
i
:
T
i
{\displaystyle {\frac {x:STRUCT(name_{0}:T_{0},...,name_{n}:T_{n})\qquad {i=0,1,\dots ,n}}{x.item_{i}:T_{i}}}}
S
=
S
T
R
U
C
T
(
n
a
m
e
S
0
:
T
S
0
,
.
.
.
,
n
a
m
e
S
n
:
T
S
n
)
U
=
S
T
R
U
C
T
(
n
a
m
e
U
0
:
T
U
0
,
.
.
.
,
n
a
m
e
U
m
:
T
U
m
)
m
,
n
∈
Z
+
∀
i
∈
m
→
n
a
m
e
U
m
∈
{
n
a
m
e
S
j
}
n
≥
m
b
e
l
o
n
g
T
o
(
S
,
U
)
{\displaystyle {\frac {S=STRUCT(name_{S_{0}}:T_{S_{0}},...,name_{S_{n}}:T_{S_{n}})\qquad U=STRUCT(name_{U_{0}}:T_{U_{0}},...,name_{U_{m}}:T_{U_{m}})\qquad m,n\in \mathbb {Z} ^{+}\qquad \forall i\in m\rightarrow name_{U_{m}}\in \{name_{S_{j}}\}\qquad n\geq m}{belongTo(S,U)}}}
x
i
:
X
i
y
:
Y
,
i
=
0
,
1
,
…
,
n
(
λ
(
x
0
,
…
,
x
n
)
.
y
)
:
(
X
0
,
…
,
X
n
)
→
Y
{\displaystyle {\frac {x_{i}:X_{i}\qquad y:Y,i=0,1,\dots ,n}{(\lambda (x_{0},\dots ,x_{n}).y):(X_{0},\dots ,X_{n})\rightarrow Y}}}
x
i
:
T
x
i
n
i
:
T
n
i
b
e
l
o
n
g
T
o
(
T
x
i
,
T
n
i
)
i
=
0
,
1
,
.
.
.
,
m
f
o
o
:
(
(
T
n
0
,
…
,
T
n
m
)
→
Y
)
f
(
x
0
,
…
,
x
m
)
:
Y
{\displaystyle {\frac {x_{i}:T_{x_{i}}\qquad n_{i}:T_{n_{i}}\qquad {belongTo(T_{x_{i}},~T_{n_{i}})}\qquad {i=0,1,...,m}\qquad {foo:((T_{n_{0}},\dots ,T_{n_{m}})\rightarrow Y)}}{f(x_{0},\dots ,x_{m}):Y}}}
x
i
:
T
i
do
{
x
0
;
x
1
;
.
.
.
;
x
n
}
(
do
{
x
0
;
x
1
;
.
.
.
;
x
n
}
)
:
T
n
{\displaystyle {\frac {x_{i}:T_{i}\qquad {\textrm {do}}\{x_{0};x_{1};...;x_{n}\}}{({\textrm {do}}\{x_{0};x_{1};...;x_{n}\}):T_{n}}}}
letrec: 如果 foo 的輸入型別 x
i
滿足要求,就假設宣告的 foo 型別 (X
0
,...,X
n
)→Y 屬性存在。再帶入到函數內部,最後檢查 return 的型別是不是 Y。
關聯條目
Brill Tagger
Django Unleashed筆記
Grid於Rust的Gtk4 binding
OCaml筆記
一個外行對依值型別的理解-文字檔