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绑定中的表达式是一个值或变量时,才会给一个变量多态类型。防止下面的错误

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

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

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

3 相互递归

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

fun f1 p1 = e1
and f2 p2 = e2
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. MVC 导出Execl 的总结几种方式 (二)

    接着上面的来,继续导出Execl 的功能 使用FileResult 方式直接可以生产Execl ,这样我们将会写大量处理后台的代码,个人感觉不好,只是展示出来,提供参考 第一步:编辑控制器 publi ...

  2. For循环中由于ajax异步导致的问题解决(增加alert数据正常,去掉alert之后数据错误)

    由于ajax异步请求的机制,for循环运行不会等内部ajax请求结束,而直接循环到最后.解决方法:将for循环里面的请求单独封装一个方法. 个人遇到的问题具体如下 下面这段代码,如果第5行studat ...

  3. DOM基础操作(三)

    DOM剩余的两个操作一并带来! 1.删除操作 removeChild 这个方法依然是父级调用的,参数就是要删除的子节点,其实实际上是剪切,这个方法会把我们删除掉的元素给返回,我们可以用一个变量去保存这 ...

  4. 02--CSS的继承性和层叠性

    一 继承性 css有两大特性:继承性和层叠性 面向对象语言都会存在继承的概念,在面向对象语言中,继承的特点:继承了父类的属性和方法.那么我们现在主要研究css,css就是在设置属性的.不会牵扯到方法的 ...

  5. 理解android中ListFragment和Loader

    一直以来不知Android中Loader怎么用,今天晚上特意花了时间来研究,算是基本上搞明白了,现在把相关的注释和代码发出来,以便笔记和给网友一个参考,错误之处还望大家给我留言,共同进步,这个例子采用 ...

  6. MySQL中有关char、varchar、int、tinyint、decimal

    char.varchar属于字符串类型 1.char属于定长,能确切的知道列值的长度,也就是有多少个字符.当指定char(5)时,表示只能存5个字符,如5个英文‘a’,5个汉字‘我’,5个符号‘&am ...

  7. CSS中的line-height

    基本概念 行高.行距 行高是指文本行基线间的垂直距离.那什么是基线呢?记不记得vertical-align属性有个baseline值,这个baseline就是基线. 注意:倒数第二根才是基线(base ...

  8. springboot监控

    springboot版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  9. 使用 Azure PowerShell 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager

    以下步骤演示了如何使用 Azure PowerShell 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 也可根据需要通过 Az ...

  10. .net core系列之《将.net core应用部署到Ubuntu》

    1.首先准备一个演示项目. 2.然后将这个项目用FileZilla工具上传到Ubuntu中. 3.进入目标文件,接下来有两种方法来部署项目 a.用dotnet run命令 root@hhz-virtu ...