Programming Language A 学习笔记(二)
1. 语法糖——元组的“名称引用”与“位置引用”:
(e1,...,en) <=> {1=e1,...,n=en}
类型:t1 * … * tn <=> {1:t1,...,n:tn}
2. 自定义数据类型绑定:
datatype mytype = TwoInts of int * int
| Str of string
| Pizza
3. 访问自定义数据类型的值:
fun f x = (* f has type mytype -> int *)
case x of
Pizza => 3
| TwoInts(i1, i2) => i1 + i2
| Strs=>String.sizes
4. 数据类型绑定与Case表达式简化描述:
datatype t = C1 of t1 | C2 of t2 | … | Cn of tn
case e of p1 => e1 | p2 => e2 | … | pn => en
5. 类型别名(Type Synonyms)
type foo = int
6. 自定义列表类型
datatype my_int_list = Empty
| Cons of int * my_int_list
7. 多态类型(Polymorphic Datatypes)
datatype 'a option = NONE | SOME of 'a
二叉树定义:
datatype ('a, 'b) tree = Node of 'a * ('a, 'b) tree * ('a, 'b) tree
| Leaf of 'b
8. Val-Binding的真相——模式匹配(Pattern-Matching for Each-Of Types)
例8-1-1:
fun sum_triple (triple : int * int * int) =
case triple of
(x, y, z) => z + y + x
例8-2-1:
fun full_name (r : {first : string, middle : string, last : string}) =
case r of
{first = x, middle = y, last = z} => x ^ "" ^ y ^ "" ^ z
例8-2-2:
fun full_name (r : {first : string, middle : string, last : string}) =
let val {first = x, middle = y, last = z} = r
in
x ^ "" ^ y ^ "" ^ z
end
例8-1-2:
fun sum_triple (triple : int * int * int) =
let val (x, y, z) = triple
in
x + y + z
end
例8-2-3:
fun full_name {first = x, middle = y, last = z} =
x ^ "" ^ y ^ "" ^ z
例8-1-3:
fun sum_triple (x, y, z) =
x + y + z
9. 题外话——类型推导(Type inference)
In ML,every variable and function has a type (or your program fails to type-check)—
type inference only means you do not need to write down the type.
10. 题外话——多态类型与等价类型
'a list * 'a list -> 'a list
可以替换为:string list * string list -> string list
不能替换为:string list *int list -> string list
'a 必须替换为同样的数据类型
11. 嵌套模式(Nested Patterns)
a::(b::(c::d)) 包含至少3个元素的list
a::(b::(c::[])) 只包含3个元素的list
模式匹配的递归定义(the elegant recursive denition of pattern matching)
|
1 |
A variable pattern(x) matches any value v and introduces one binding (from x to v). |
|
2 |
The pattern C matches the value C,if C is a constructor that carries no data. |
|
3 |
The pattern C p where C is a constructor and p is a pattern matches a value of the form C v (notice the constructors are the same) if p matches v (i.e., the nested pattern matches the carried value). It introduces the bindings that p matching v introduces. |
|
4 |
The pattern (p1,p2,...,pn) matches a tuple value (v1,v2,...,vn) if p1 matches v1 and p2 matches v2, ..., and pn matches vn. It introduces all the bindings that the recursive matches introduce. |
|
5 |
(A similar case for record patterns of the form {f1=p1, … , fn=pn} ...) |
例11-1-1:
fun len xs =
case xs of
[] => 0
| x::xs' => 1 + len xs'
例11-1-2:
fun len xs =
case xs of
[] => 0
| _::xs' => 1 + len xs'
通配符(wildcard) (_) 指代任意没有定义数据类型的值
12. 可用的嵌套模式范例:
例12-1:
exception BadTriple
fun zip3 list_triple =
case list_triple of
([], [], []) => []
| (hd1::tl1, hd2::tl2, hd3::tl3) => (hd1, hd2, hd3)::zip3(tl1, tl2, tl3)
| _ => raiseBadTriple
fun unzip3 lst =
case lst of
[] => ([], [], [])
| (a, b, c)::tl => let val (l1, l2, l3) = unzip3 tl
in
(a::l1, b::l2, c::l3)
end
例12-2:
datatype sgn = P | N | Z
fun multsign (x1, x2) =
let fun sign x = if x = 0 then Z else if x > 0 then P else N
in
case(sign x1,sign x2) of
(Z, _) => Z
| (_, Z) => Z
| (P, P) => P
| (N, N) => P
| _ => N (* many say bad style; I am okay with it *)
end
13. 多重选择的函数定义(Multiple Cases in a Function Binding)
例13-1:
datatype exp = Constant of int | Negate of exp | Add of exp * exp | Multiply of exp * exp
fun eval(Constant i) = i
| eval(Negate e2) = ~(eval e2)
| eval(Add(e1, e2)) = (eval e1) + (eval e2)
| eval(Multiply(e1, e2))=(eval e1) * (eval e2)
fun append ([], ys) = ys
| append (x::xs', ys) = x::append(xs', ys)
一般形态(语法糖形式):
fun f p1 = e1
| f p2 = e2
...
| f pn = en
普通写法:
fun f x =
case x of
p1 => e1
| p2 => e2
...
| pn => en
14. 异常(Exception)
输出异常(关键字) raise:raise List.Empty
定义异常(关键字)exception:exception MyUndesirableCondition
15. 尾递归和累加器
fun sum1 xs =
case xs of
[] => 0
| i::xs' => I + sum1 xs'
16. 尾递归的定义
递归的调用出现在尾位置(saying a call is a tail call if it is in tail position.)
尾位置定义:
|
1 |
In fun f(x) = e, e is in tail position. |
|
2 |
If an expression is not in tail position, then none of its sub expressions are in tail position. |
|
3 |
If if e1 then e2 else e3 is in tail position, then e2 and e3 are in tail position (but not e1).(Case-expressions are similar.) |
|
4 |
If let b1 … bn in e end is in tail position,then e is in tail position (but no expressions in the bindings are). |
|
5 |
Function-call arguments are not in tail position. |
Programming Language A 学习笔记(二)的更多相关文章
- Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- SQL Expression Language Tutorial 学习笔记二
11. Using Textual SQL 直接使用 SQL 如果实在玩不转, 还是可以通过 test() 直接写 SQL. In [51]: s = text( ...: "SELECT ...
- Programming Language A 学习笔记(一)
SML(一) 1. ML是一个函数式编程语言,理论基础为λ演算. 2. 变量声明 val x = e; 标准类型:单元(unit).布尔(bool).整型(int).字符串(string).实数(re ...
- 《The C Programming Language》学习笔记
第五章:指针和数组 单目运算符的优先级均为2,且结合方向为自右向左. *ip++; // 将指针ip的值加1,然后获取指针ip所指向的数据的值 (*ip)++; // 将指针ip所指向的数据的值加1 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- 转)delphi chrome cef3 控件学习笔记 (二)
(转)delphi chrome cef3 控件学习笔记 (二) https://blog.csdn.net/risesoft2012/article/details/51260832 原创 2016 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
随机推荐
- Linux文件类型
1.windows系统和Linux系统的区别 windows通过问价扩展名来区分文件类型,例如*.txt是一个文本文件, linux系统文件的扩展名和文件类型没有关系 为了容易区分文件类型,linux ...
- Javascript权威指南学习笔记
第二章:词法结构 ;function a(){alert(2)};//前面的分号保证正确地语句解析 第三章:类型.值和变量 基本概念: 1.数据类型---能够表示并操作的值的类型叫做数据类型. 2.变 ...
- BeanUtils.populate(obj, map);
public static void populate(Object bean, Map<String, ? extends Object> properties) throws Ille ...
- 【ASP.NET】复制单个文件同时到多个目录
有时候,当我们更新了一个dll文件后,需要将该dll文件复制到到不同的文件夹中,手动操作会很麻烦,因此可以考虑利用程序实现. 利用powershell批量复制 示例代码如下: $source=&quo ...
- ScriptedSandbox64.exe 在写Winform程序Debug时不停提交数据
抓包时发现不停的在提交数据,导致抓包内容看不到. 取消方式:Tools -> Options -> Debugging -> General -> Enable Diagnos ...
- git 命令熟悉
1. git clone +ssh 地址=将远程代码download 到本地:要在根目录执行这个操作 2.查看所有分支:git branch -a (当前分支前带星号) 3.切换到某个分支:git c ...
- 简单的sql server连接
private string constring="data source=112.74.73.122;initial catalog=qzyData;user id=sa;password ...
- 惊闻Java要收费之后
今天看到朋友圈里的文章 <Oracle终于要向Java的非付费用户开枪了>,被这个标题吓了一跳,还以为Java要全面收费了.又被标题党骗了. 但是仔细想想,以Oracle公司的尿性,没准哪 ...
- Centos挂载第二块硬盘
作为一个初创小公司的架构师,工作内容纷繁复杂,涉及了系统管理员.数据库管理员.架构师.高级软件工程师.项目经理的部分. 今天的任务是安装公司的服务器,使用centos6.7.安装过程就不用细讲了. ...
- 使用 jsoup 对 HTML 文档进行解析和操作
jsoup 简介 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HT ...