programming-languages学习笔记--第4部分
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部分的更多相关文章
- CUDA Programming Guide 学习笔记
CUDA学习笔记 GPU架构 GPU围绕流式多处理器(SM)的可扩展阵列搭建,每个GPU有多个SM,每个SM支持数百个线程并发执行.目前Nvidia推出了6种GPU架构(按时间顺序,详见下图):Fer ...
- Programming Erlang 学习笔记(一)
入门 启动Shell 在cmd中输入命令”erl”,百分号(%)表示一个注释的开始,从百分号开始到这行结束的所有文本都被看做是注释. 一个完整的命令需要以一个句点和一个回车结束. 退出erlang的命 ...
- UIView Programming Guide学习笔记
|View |Creating and Configuring View Objects |Creating and Managing a View Hierarchy |Adjusting the ...
- The C++ Programming Language 学习笔记 第7章 函数
1.关于内联函数(inline) 借用一下书中的例子. inline int fac(int n) { ) ? :n*fac(n-); } inline描述符给编译器一个提示,要求 ...
- The C++ Programming Language 学习笔记 第6章 表达式和语句
1.关于strcpy函数. 书中说c风格的字符串尽量少用,strcpy这样的函数应该也要少用.这里讲这个函数主要是要通过本章课后练习第十题来讲一下前面提及的要点.巩固一下前几章的知识.写了一段,本来感 ...
- The C++ Programming Language 学习笔记 第5章 指针、数组和结构
1.关于输出指向字符的指针的值. 现在定义,char c='a',char* pc=&c.在C中,输出该值只需要printf("%p\n",pc);而在C++中,如果cou ...
- The C++ Programming Language 学习笔记 第四章 类型和声明
1.关于main 函数中的 return 0 C99标准中,main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统).如果 main 函数的最后没有写 return ...
- 3D Game Programming withDX11 学习笔记(一) 数学知识总结
在图形学中,数学是不可或缺的一部分,所以本书最开始的部分就是数学知识的复习.在图形学中,最常用的是矢量和矩阵,所以我根据前面三个章节的数学知识,总结一下数学知识. 一.矢量 数学中的矢量,拥有方向和长 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...
- Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
随机推荐
- Visual Studio for Mac 安装无响应或者无法连接网络等解决方法
1.无法连接到网络 2.点击安装和更新无响 这两种情况造成的原因都是由于被墙的原因,第一种情况有部分可以通过fq解决,第二种情况是我遇到过的 反正我全局也失败 这里给出一个我自己用过的解决方案 查看控 ...
- 启动Hadoop时候datanode没有启动的原因及解决方案
有时候我们start-dfs.sh启动了hadoop但是发现datanode进程不存在 一.原因 当我们使用hadoop namenode -format格式化namenode时,会在namenode ...
- 【Java】短信信息提取设计
问题产生:当有要求做信息有效性校验的时候,如何提取短信中有用的信息? 举个例子:有这样一条短信消息: [XXXXXX提醒]尊敬的客户,截止03月21日15:29,您本月套餐中包含手机上网国内流量累计1 ...
- .NET Core是什么
对于开发人员,把C#语言和.NET描述为最重要的新技术一点都不夸张.NET提供了一种环境.在这种环境中,可以开发在Windows上运行的几乎所有应用程序.如:编写Web页面.WPF应用程序.REST ...
- JQuery 判断指定ID是否存在
- C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序
基类和派生类:构造函数和析构函数的执行顺序 在Visual Studio中,新建控制台工程,构造类如下: #include<iostream> using namespace std; c ...
- .NET开源工作流RoadFlow-流程设计-流程步骤设置-事件设置
事件设置是设置当前步骤在提交前后或退回前后要执行的一些操作(该事件为服务器事件). 事件格式为:dll名称.命名空间名称.类名.方法名,这里不需要写括号和参数,处理时会自动带上当前流程实例的相关参数. ...
- Redirect local emails to a remote email account
My previous post is a guide for setting up exim4, an SMTP mail server, to use Gmail as a smarthost. ...
- MUI框架-08-窗口管理-创建子页面
MUI框架-08-窗口管理-创建子页面 之前写过这一篇,不知道为什么被删了,我就大概写了,抱歉 创建子页面是为了,页面切换时,外面的页面不动,让 MUI 写出来的页面更接近原生 app 官方文档:ht ...
- 使用@Value进行静态常量的值注入
@Component public class ExpressConstant { public static String URL; @Value("${express.url}" ...