# 解决修补程序方法 是大于 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 ```