programming-languages学习笔记–第4部分

*/-->

pre.src {background-color: #292b2e; color: #b2b2b2;}

programming-languages学习笔记–第4部分

1 什么是类型推导

编译时的类型检查,防止一些错误。静态类型语言的特性。

动态类型语言较少或没有做这些检查,有可能在运行时将一个数字认为一个函数。

ML,Java,C#,Scala,C,C++都是静态类型的,所有的绑定在编译时确定。类型检查器在编译时确定接受还是拒绝一个程序。与此相对,Racket,Ruby和Python是动态类型语言,意味着绑定的类型不是提前确定的,比如绑定x为42,然后把x认为是字符串将导致运行时错误。

ML是隐式类型,不需要写出类型,这很方便(要考虑是否让代码更方便或更难读)。

2 ML类型推导

关键步骤:

  • 按顺序确定类型绑定

    • 除了相互递归
    • 不能使用延迟绑定(later bindings):没有类型检查
  • 对每个val或fun绑定:
    • 分析所有必要事实(约束)的定义
    • 例如:如果遇到x>0,那么x必须是int类型。
    • 如果无法确定所有事实正确(过度约束),则类型错误。
  • 之后,对任何未约束的类型使用类型变量(例如'a)
    • 例如未使用的函数参数可以是任意类型。
  • 最后,强制进行值约束

值约束:只有val绑定中的表达式是一个值或变量时,才会给一个变量多态类型。防止下面的错误

  1. val r = ref NONE
  2. val _ = r := SOME "hi"
  3. val i = + valOf(!r)
  1. stdIn:1.6-2.1 Warning: type vars not generalized because of
  2. value restriction are instantiated to dummy types (X1,X2,...)
  3. stdIn:5.5-5.23 Error: operator and operand do not agree [tycon mismatch]
  4. operator domain: ?.X1 option ref * ?.X1 option
  5. operand: ?.X1 option ref * string option
  6. in expression:
  7. r := SOME "hi"
  8. stdIn:6.5-6.22 Error: operator and operand do not agree [overload conflict]
  9. operator domain: [+ ty] * [+ ty]
  10. operand: [+ ty] * ?.X1
  11. in expression:

在上面的例子中ref NONE调用函数ref,它不是一个值或变量,因此给出警告。可以使用类型注释指定r为非多态类型:

  1. val r:int option ref = ref NONE
  2. val _ = r := SOME
  3. val i = + valOf(!r)
  1. val r = ref (SOME 3) : int option ref
  2. val i = 4 : int

3 相互递归

f调用g,g调用f. 使用and关键字

  1. fun f1 p1 = e1
  2. and f2 p2 = e2
  3. and f3 p3 = e3

实现状态机的理想方式

4 用模块管理命名空间

模块可以用来隐藏绑定和类型

在ML中,模块不是表达式,不能在函数中定义,保存为tuples,作为参数传递等。

使用open打开命名空间,常用于在模块外面测试一个模块。

5 签名

模块的类型就是签名。可以用来隐藏一些细节。

signature SIGNAME =
sig types-for-bindings end

6 等效实现

改进/修改一个库不会破坏客户端。知道客户服从由ML的签名强制执行的抽象边界,是非常宝贵的。

使用限制性签名的好处:以后修改实现代码的时候,不需要检查所有客户端。

通过使用更严格的接口,可以使用更多不同的等效实现,因为客户端无法区别差异。

两个函数是等效的,当在同样的环境下,给它们同样的参数:

  • 产生相同的结果
  • 拥有相同的终止行为
  • 以同样的方式改变同样的(客户端可见)内存
  • 做同样的输入/输出
  • 产生相同的异常

作者: ntestoc

Created: 2018-12-18 Tue 20:29

programming-languages学习笔记--第4部分的更多相关文章

  1. CUDA Programming Guide 学习笔记

    CUDA学习笔记 GPU架构 GPU围绕流式多处理器(SM)的可扩展阵列搭建,每个GPU有多个SM,每个SM支持数百个线程并发执行.目前Nvidia推出了6种GPU架构(按时间顺序,详见下图):Fer ...

  2. Programming Erlang 学习笔记(一)

    入门 启动Shell 在cmd中输入命令”erl”,百分号(%)表示一个注释的开始,从百分号开始到这行结束的所有文本都被看做是注释. 一个完整的命令需要以一个句点和一个回车结束. 退出erlang的命 ...

  3. UIView Programming Guide学习笔记

    |View |Creating and Configuring View Objects |Creating and Managing a View Hierarchy |Adjusting the ...

  4. The C++ Programming Language 学习笔记 第7章 函数

    1.关于内联函数(inline)      借用一下书中的例子. inline int fac(int n) { ) ? :n*fac(n-); }      inline描述符给编译器一个提示,要求 ...

  5. The C++ Programming Language 学习笔记 第6章 表达式和语句

    1.关于strcpy函数. 书中说c风格的字符串尽量少用,strcpy这样的函数应该也要少用.这里讲这个函数主要是要通过本章课后练习第十题来讲一下前面提及的要点.巩固一下前几章的知识.写了一段,本来感 ...

  6. The C++ Programming Language 学习笔记 第5章 指针、数组和结构

    1.关于输出指向字符的指针的值. 现在定义,char c='a',char* pc=&c.在C中,输出该值只需要printf("%p\n",pc);而在C++中,如果cou ...

  7. The C++ Programming Language 学习笔记 第四章 类型和声明

    1.关于main 函数中的 return 0 C99标准中,main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统).如果 main 函数的最后没有写 return ...

  8. 3D Game Programming withDX11 学习笔记(一) 数学知识总结

    在图形学中,数学是不可或缺的一部分,所以本书最开始的部分就是数学知识的复习.在图形学中,最常用的是矢量和矩阵,所以我根据前面三个章节的数学知识,总结一下数学知识. 一.矢量 数学中的矢量,拥有方向和长 ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...

  10. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

随机推荐

  1. 记一次吐血的暴力模拟qaq 【多项式输出】

    题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i 次项,ai 称为 i 次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 1. 多项式中 ...

  2. 十七、ThreadPoolExecutor线程池

    一.简介 executor接口 executor接口在JDK的java.util.concurrent包下,它只有一个抽象方法: void execute(Runnable command); 这意味 ...

  3. redis 学习(一)

    一.Redis概述 1.什么是NoSql NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它泛指非关系型的数据库. 随着互联网2003年之后web2.0网站的兴起,传 ...

  4. PoPo数据可视化周刊第4期

    PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域,发现可视化领域有意思的内容.不想错过可视化领域的精彩内容, 就快快关注我们吧 :) 微信号:popodv_com   由于国庆节的原因,累计 ...

  5. Maven学习总结(八):Myecplise中配置maven

    第一步:下载maven安装包,配置环境变量M2_HOME;变量值为maven的解压目录. 第二步:在eclipse4.0之前的版本需要安装maven插件,方法即:将maven插件包复制到eclipse ...

  6. IhyerDB modBus采集器配置.

    近期查了一下ihyerDB-modbus采集器的相关配置,由于没有相关的modbus设备,于是今天上午根据网上的线索下载了Modbus Slave(modbus从站仿真器).笔记本也没有串口,于是下载 ...

  7. JDK自带工具native2ascii

    背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码.原因是java ...

  8. 转 string和byte[]的转换 (C#)

    转 string和byte[]的转换 (C#)  string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ...

  9. [翻译] ATTutorialController

    ATTutorialController https://github.com/AfonsoTsukamoto/ATTutorialController A simple to use tutoria ...

  10. Android开发(7)数据库和Content Provider

    问题聚焦: 思想:应用程序数据的共享 对数据库的访问仅限于创建它的应用程序,但是事情不是绝对的 Content Provider提供了一个标准的接口,可供其他应用程序访问和使用其他程序的数据 下面我们 ...