![](https://csdnimg.cn/release/download_crawler_static/88749170/bg5.jpg)
C.
安德森,
P
。
Giannini/Electronic Notes in Theoretical Computer Science 138
(
2005
)
37
函数的返回值。例如,
moneyTrans
的类型为
t
1
:
(
moneyy
:
In
t
>
>
,
In
t
)
→
In
t
当
他
遇到一个
变量
<<
时 , 这 是 一 个 参 数 :
Int
>>
,
参数
类型
为
Int
,返回
类型为
Int
。
当一个函数在调用时被用作对象的方法时,我们检查接收者是否
是函数中this声明类型的子类型 例如
,与保罗一起
,payMe(10)
在
21
行
中具有
μ
a
。
<<
钱
:
In
t
,
payMe
:
t1
,
boss
:
t2
?
这
是
<<
一个很大的钱
:
我不
。
对于对象类型,子类型是基于所涉及的类型的结构。要使类型t成为
类型t
J
的子类型,t必须至少声明t
J
中定义的具有相同类型的成员。 如果
一个成员在t
J
中定义,那么它也必须在t中定义。我 们 在类型
μ α
中看到了
这一点
。
<
<
moneyy
:
In
t
,
payMe
:
t
1
,
boss
:
α
>>
,
of
a
v
a
r
i
a
bable
paul
b
e
ing
a
subtyp
eof
f
<<
钱
:
我不
>>
,
这种类型的这是
declard在
钱transs
。
这
意味
着
函
数moneyTrans可以用作任何对象的方法,其声明的类型包含Int类型的
成员money。考虑函数moneyTrans1返回自身:
function moneyTrans1(x:
Int
):
μ α.
(
Int
,
Int
)→
α
{
this.money.com
this.money =
this.money +
x
;
moneyTrans1;
}
与对象类型一样,绑定器μ a允许函数类型引用自身。
function Person(x:Int):t
3
{
function moneyTrans(x:Int):
Int{
this.money = this.money + x
functionaln
employPerson
(
x:
t
3
,y
:
t
3
):
t
4
t
3
public void run(100);
t
3
paul = new Person(0)
paul=employPerson(paul,john);paul.payMe
(10);paul.boss
图二
.
类型化
JS
0
Person
示例