文档详情

研究生院第六章详解.ppt

发布:2017-04-11约字共66页下载文档
文本预览下载声明
* * * * * * * 实际上,int转换为float也可能会丢失精度 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 多态函数(16) 例:ML函数类型的类型推导: fun length ( lptr ) = if null( lptr ) then 0 else length( tl( lptr ) ) + 1; 分别引入类型变量β和γ 表示length和lptr的类型,length(lptr)的类型和函数体的类型匹配,所以length的类型是 类型声明及要检查的表达式 多态函数(17) 行 表达式 :类型 代换 (1) lptr :γ (2) length : β (3) length( lptr ) : δ β=γ→δ (4) lptr :γ (5) null : list(αn)→ boolean (6) null( lptr ) : boolean γ= list(αn) (7) 0 : integer (8) lptr : list(αn) (9) tl : list(αt)→ list(αt) (10) tl( lptr ): list(αn) αt→ αn (11) length : list(αn)→ δ (12) length( tl( lptr ) ) : δ (13) 1 : integer (14) + : integer×integer→integer (15) length( tl( lptr ) ) + 1: integer δ=integer (16) if : boolean×αi×αi→ αi (17) if ( … ) :integer αi=integer (18) match : αm×αm→ αm (19) match( … ):integer αm=integer 多态函数(18) 由(3)可知length的函数类型表达式 由(6)知道γ 和list(αn)合一,此时知道length的类型是:对任何类型αn,list(αn)→δ 在(15)知道δ和integer合一 最后得到length的类型: * * * * * * 嵌入的代码是把子程序中的操作代码复制到程序中的调用点。 * * * * * * * * * * * * * * * * * * * * 从这里可以看出静态类型检查的缺点,数组的类型检查中E2只察看了类型,并没有讨论其取值范围,所以潜在的无法检查出越界访问 * * * 简单类型检查器的说明(10) 从整型到实型的类型检查规则: E→num { E.type := integer } E→num.num { E.type := real } E→id { E.type := lookup(id.entry) } E→E1 op E2 { E.type := if E1.type = integer and E1.type = integer then integer else if E1.type = integer and E1.type = real then real else if E1.type = real and E1.type = integer then real else if E1.type = real and E1.type = real then real else type_error } 类型表达式的等价(1) 类型等价 类型检查经常要面临的问题: 两个类型表达式是否表示相同的类型 struct t1 { struct t2 { int x; int x1; int y[100]; int y1[100]; }; }; 类型等价和类型表示是相互影响的 类型等价的常用形式 结构等价 名字等价 在类型等价中,递归定义如何处理 类型表达式的等价(2) 类型表达式的结构等价 结构等价的定义 两个类型表达式是同样的基本类型 或两
显示全部
相似文档