第三讲编程语言的类型系统.ppt

  1. 1、本文档共44页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三讲编程语言的类型系统

* * * * * * * * * * * * * * * * * * * * * * * * * 多 态 类 型 多态类型 多态函数和多态算符的类型 sort:??.(??? ? bool )?array(…, ?) ? array(…, ?) : ??. ? ? pointer(?)(取地址多态算符) [ ] :??. array(…, ?)?int ?? (下标索引多态算符 ) length: ??.list(?) ?int (计算表长的函数) 多态类型的成员可应用于多种类型的元素而不必提及这些类型 例如:length ( [“sun”, “mon”, “tue”] ) length ( [10, 9, 8 ] ) * 多 态 类 型 多态函数的类型推断 用简单的例子(取指针指向的对象)来展示 long deref (long *p) { return *p } 为适应可用于任何指针类型的变元,改成如下形 参和结果类型都省略的函数 deref (p) { return *p } 类型推断:在类型信息不完全时的定型判定 类型推断规则较为复杂,在此不介绍。下面举例解释 * 多 态 类 型 多态函数定义的类型推断 根据函数体中的语句来推断多态函数的类型 deref (p) { //p的类型一无所知,暂定为p : ? return *p // 需要根据“*” 的类型来计算 } ? 由编程语言知,“*” : ??. pointer(?) ? ? ? 对*的上述出现,脱掉?,用新类型变量?,得 pointer(?) ? ?,再对? 和pointer(?)进行合一计算 ? 得? = pointer(?) ,即deref : pointer(? ) ? ? ? 再戴上?,得deref : ??. pointer(? ) ? ? * 多 态 类 型 多态函数应用(application)的类型检查 检查表达式deref(deref (q )) (相当于**q)的类型, 其中q的类型是pointer(pointer(int)) 需要经过下面两步合一代换, 才能通过类型检查, 并得出结果类型int ? ?i代换成pointer(int) ? ?o代换成int apply : ?o derefo: pointer(?o) ? ?o apply : ?i derefi : pointer(?i) ? ?i q: pointer(pointer(int)) = pointer(int) = int * 多 态 类 型 多态函数与重载函数的区别 在Ada语言中,可以定义如下二个函数: function “*”(i,j: integer) return complex;{ …} function “*”(x,y: complex) return complex; { …} 则算符*有三个函数,其类型分别是 integer ? integer ? integer(这是语言预定义的) integer ? integer ? complex complex ? complex ? complex “*”是重载函数: 根据实参类型选用不同的具体函数 deref是多态函数:一个函数适用于很多种实参类型 * 依 赖 类 型 对依赖类型的需求 类型集合:基本类型、类型构造符作用于若干类 型得到的构造类型 基于这种类型集合的类型系统,能否编写: ? 零向量构造函数zero_vector 应用到自然数n,得到长度为n的零向量 ? 较长向量构造函数cons 应用到长度为n的向量,得到长度为n+1的向量 ? 拼接向量的函数append 把长度为m和n的向量拼接成长度为m+n的向量 * 依 赖 类 型 依赖类型 依赖类型是指依赖于某些类型的项的类型 若有类型构造符vector,应用于项n,vector(n)表示长度为n的所有向量构成的类型 这与类型构造符pointer应用于类型int,得到pointer(int)是不同的 先前三个函数的类型 ? zero_vector: ?n:nat. vector(n) ? cons: ?n:nat. data ? vector(n) ? vector(n+1) ? append: ?m:nat. ?n:nat. vector(m) ? vector(n) ? vector(m

文档评论(0)

2105194781 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档