编程语言的类型系统计算机科学导论第三讲.pptVIP

编程语言的类型系统计算机科学导论第三讲.ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * * * * * * * * * * * * * * * * * * * * 多 态 类 型 多态函数定义的类型推断 根据函数体中的语句来推断多态函数的类型 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+n) 依 赖 类 型 依赖类型 用C可编写zero_vector: ?n:nat. vector(n)等函数: #include malloc.h long * zero_vactor(int n) { int i; long* p; p = malloc(n * sizeof(long)); for(i = 0; i n; i++) p[i] = 0; } 但编译器不认为所编函数有上述类型,而只看成 zero_vector : int ? pointer(long) 依 赖 类 型 无依赖类型给C编程带来的麻烦 以I/O函数为例,一个程序如下: #include stdio.h main() {printf(“%d, %d, %d\n”);} 编译器报告错误?运行时报告错误?若可正常运行,输出是什么? 过去的(包括现在某些)编译器不报告错误,运行结果是输出3个整数,其值不能预知 现在的一些编译器(包括GCC 的高版本)给出警告错误: format ‘%d’ expects a matching ‘int’ argument 依 赖 类 型 无依赖类型给C编程带来的麻烦 难以完成spri

文档评论(0)

***** + 关注
实名认证
文档贡献者

本账号下所有文档分享可拿50%收益 欢迎分享

1亿VIP精品文档

相关文档