# 解决修补程序方法
是大于 0 的,即的子类型。本来不存在于 Python 的类阶层中。Erg 如何解决这个补丁的方法呢?
```erg
1.times do:
log "hello, world"
```
是的补丁方法。由于是的实例,所以首先要沿着的 MRO(方法解析顺序)进行搜索。Erg 在的 MRO 中有,。它来自 Python(在 Python 中)。方法在这两个方法中都不存在。从这里开始,进入该子类型的探索。
~
整数在其上位型中显然应该具有实数和复数,甚至是整体数,但在与 Python 具有互换性的层中却不出现这一事实。但是实际上在 Erg 中,和是。至于,虽然是与没有继承关系的类,但作为类型被判断为具有互换性。究竟是怎么回事?
~
对于某个对象,其所属的类型有无数个。但是实际上必须考虑的是拥有方法的类型,即只有拥有名字的类型。
Erg 编译器拥有所有提供方法及其安装的补丁型散列映射。每次新定义类型时,此表都会更新。
```erg
provided_method_table = {
...
"foo": [Foo],
...
".times": [Nat, Foo],
...
}
```
具有方法的类型为,。从这些中,寻找符合型的。符合判定有两种。筛型判定和记录型判定。从筛型判定开始进行。
## 筛子型判定
检查候选类型是否与类型兼容。筛型中与兼容的有,等。,等有限元的代数运算类型,如果声明为基本类型,则被归一化为筛子类型(即,,)。在这次的情况下,由于是,所以与是兼容的。
## 记录类型判定
确认是否与候选类型为 1 的类兼容。此外,当的补丁,并且具有所有的要求属性时,也具有兼容性。
~
因此,是合适的。但是,当也符合时,根据和的包含关系进行判定。也就是说,选择子类型的方法。如果两者没有包含关系,则会出现编译错误(这是一种安全措施,可防止执行与程序员意图相反的方法)。为了消除错误,必须明确指定修补程序。
```erg
o.method(x) -> P.method(o, x)
```
## 全称补丁程序方法解析
定义如下补丁。
```erg
FnType T: Type = Patch T -> T
FnType.type = T
```
在补丁的基础上可以进行以下代码。这又将如何解决呢?
```erg
assert (Int -> Int).type == Int
```
首先,中以以下形式登录。
```erg
provided_method_table = {
...
"type": [FnType(T)],
...
}
```
检查是否符合的补丁类型。此时,的补丁类型为。这符合。匹配后,进行单相化置换(取和的 diff。)。
```erg
assert FnType(Int).type == Int
```