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 学习笔记(二)的更多相关文章

  1. Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools

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

  2. SQL Expression Language Tutorial 学习笔记二

    11. Using Textual SQL 直接使用 SQL 如果实在玩不转, 还是可以通过 test() 直接写 SQL. In [51]: s = text( ...: "SELECT ...

  3. Programming Language A 学习笔记(一)

    SML(一) 1. ML是一个函数式编程语言,理论基础为λ演算. 2. 变量声明 val x = e; 标准类型:单元(unit).布尔(bool).整型(int).字符串(string).实数(re ...

  4. 《The C Programming Language》学习笔记

    第五章:指针和数组 单目运算符的优先级均为2,且结合方向为自右向左. *ip++; // 将指针ip的值加1,然后获取指针ip所指向的数据的值 (*ip)++; // 将指针ip所指向的数据的值加1 ...

  5. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  6. 转)delphi chrome cef3 控件学习笔记 (二)

    (转)delphi chrome cef3 控件学习笔记 (二) https://blog.csdn.net/risesoft2012/article/details/51260832 原创 2016 ...

  7. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  8. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  9. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

随机推荐

  1. 简单的 MessageBox

    有时候我们只是想实现一个消息框,给用户一些文字提醒,就像javascript的alert那样.没必要因此动用那些庞大的GUI库,下面是几种轻快的实现方法. 1. ctypes import ctype ...

  2. struts2使用annotation注意事项

    struts2使用annotation注意事项 1.包名只能以.action .actions  .struts  .struts2结尾.如:com.cnbolgs.web.actions 2.类名只 ...

  3. nexus的使用

    一.在百度网盘或官网下载nexus,并部署.   注意修改: https://repository.apache.org/content/repositories/releases/    二.下载m ...

  4. 开刷LeetCode

    还是觉得自己在算法这块太弱鸡了 不多废话开刷吧,LeetCode与算法导论相辅相成双管齐下,期望能填上算法这个坑 解法没意外都是用Python2.7 由于LeetCode有提供Top Solution ...

  5. Python-第三方库requests详解

    Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...

  6. javaSE基础03

    javaSE基础03 生活中常见的进制:十进制(0-9).星期(七进制(0-6)).时间(十二进制(0-11)).二十四进制(0-23) 进制之间的转换: 十进制转为二进制: 将十进制除以2,直到商为 ...

  7. GUI基础学习

    GUI:一.界面元素:1.容器:Jwindow    JFrame    JDidye    JApplet 2.组件:标签,文本框,按钮,下拉列表,文本域,单选框,复选框 二.布局:1.边界布局:B ...

  8. pngcrush caught libpng error: Not a PNG file..

    今日真机测试遇到这样的奇葩问题: While reading XXX/XXX.png pngcrush caught libpng error: Not a PNG file.. 替换几次图片都没解决 ...

  9. JqueryEasyUI之DataGrid扩展

    DataGrid通用合并扩展方法: $.extend($.fn.datagrid.methods, { autoMergeCells: function (jq, fields) { return j ...

  10. IOS进阶之WKWebView

    前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...