用ML编写正确的程序 ML – Programming Correctly

Slides:



Advertisements
Similar presentations
完美殺人筆記簿 【爸!我受夠了!】 第七組組員: 林正敏 陳筱涵 李蓓宇 許純宜 羅玉芬 謝文軒.
Advertisements

人的性别遗传 合肥市第四十九中学 丁 艳. 男女成对染色体排序图 1 、男性和女性各 23 对染色体有何异同 ? 哪 一对被称为性染色体 ? 2 、这两幅图中,哪幅 图显示的是男性的染色 体?哪幅图显示的是女 性染色体? 3 、图中哪条染色体是 Y 染色体?它与 X 染色体 在形态上的主要区别是.
董笑菊 电子信息与电气工程学院 计算机科学与工程系
本章重點 認識衣物的基本保養程序 處理不同污漬的方法 不同布料的保養方法
1、一般地说,在生物的体细胞中, 和 都是成对存在的。
辨性别 A B. 辨性别 A B 第三节人类染色体与性别决定 昌邑市龙池初中 杨伟红 学习目标 1.理解人的染色体组成和传递规律。 2.解释人类性别决定的原理。 3.通过探究活动,解读数据了解生男生女的比例。
性别决定与伴性遗传 性别决定 伴性遗传 巩固练习.
地方教育發展基金執行實務 王麗真、江明君、魏珮如 1.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
Introduction 基本概念 授課老師:蕭志明
姓名:劉芷瑄 班級:J201 座號:39號 ISBN:957-33-1963-2
本章重點 認識香港不同年代時裝的特色 透過對服裝歷史的認識,了解香港的穿衣文化 透過服裝歷史加強對時裝潮流循環的洞悉力
Tool Command Language --11级ACM班 金天行.
行政诉讼中的律师代理 深圳市中级人民法院 王成明.
跳楼价 亏本大甩卖 清仓处理 买一送一 5折酬宾. 跳楼价 亏本大甩卖 清仓处理 买一送一 5折酬宾.
清仓处理 跳楼价 满200返160 5折酬宾.
电话联系.
迎宾员礼仪 包头机电工业职业学校管理系 白琳 1.
1.1.2 四 种 命 题.
函数式编程语言、编程和程序验证 计算机科学与技术学院 陈意云
色 弱 與 色 盲.
B081 LabVIEW 7.X 實用教本 第12章 程式架構.
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
Oracle数据库 Oracle 子程序.
程設一.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
宠物之家 我的宠物性别? 雌(♀) or 雄(♂) 第一阶段:我的宠物我做主 第二阶段:宠物“相亲记” 第三阶段:家族诞生
第20章 生物的遗传和变异 第四节 性别和性别决定 淮南二十六中 鲍娟娟. 第20章 生物的遗传和变异 第四节 性别和性别决定 淮南二十六中 鲍娟娟.
财 务 会 计 第四篇:供应链会计实务 制作人:谌君、熊瑜.
Chap4 Tree.
大綱 Labview 環境介紹 數值(Numeric) 布林值(Boolean)與比較(Comparison) 結構(Structure)
第3章 變數、資料型別與運算子.
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
第12章 樹狀搜尋結構 (Search Trees)
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
第四章 程序语言的性质.
第3章 變數、資料型別與運算子 3-1 變數與資料型別的基礎 3-2 變數的命名與宣告 3-3 資料型別 3-4 運算式與運算子
3.5 用递归法解决问题 黄学鸿.
第七讲 二维连续分布独立性与二维函数分布 本次课讲授:第二章的 ; 下次课讲第三章的 。
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
第11章 指称语义的原理与应用 指称语义学是Christopher Strachey和Dana Scott在1970年提出的。指称语义学是Christopher Strachey和Dana Scott在1970年提出的。指称语义学是Christopher Strachey和Dana Scott在1970年提出的。
Introduction to lisp lisp.
λ演算与函数式设计语言 有以下函数: Y = λg.((λf.g(f f)) (λf .g(f f)))
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第5章 函数式程序设计语言 过程式程序设计语言由于数据的名值分离, 变量的时空特性导致程序难于查错、难于修改
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
C语言程序设计.
特定消耗品說明 (指碳粉匣、墨水匣) 國立清華大學 保管組製作.
习题课
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
計算機概論 跨越講義 第4章 基本視窗程式應用 4-1 程式語言簡介 4-2 結構化VS物件導向程式設計
第6章 運算式與運算子 [算術與多功能計算機]
資料結構簡介 綠園.
3.16 枚举算法及其程序实现 ——数组的作用.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
單元名稱:結構化程式設計 報告人 劉洲溶.
学习目标 1、了解基本运算符 2、运算符优先级.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第18讲 从C到C++ 计算机与通信工程学院.
單選題 1. 2. 3. 4. Q1:下列何者能作為商標樣式?
臺中市龍山國小 校園常見瓢蟲辨識   瓢蟲屬於鞘翅目瓢蟲科。目前世界上約有5000多種瓢蟲,台灣地區約有80種以上,其中能捕食有害生物的瓢蟲約七十種之多。瓢蟲因為捕食有害生物為主食,所以又稱為『活農藥』。
百雞問題 製作者:張美玲 資料來源:數學誕生的故事—凡異出版社.
第二次课后作业答案 函数式编程和逻辑式编程
JAVA 程式設計與資料結構 第十七章 Tree.
Presentation transcript:

用ML编写正确的程序 ML – Programming Correctly 汪旻 5110379036 yinger650@gmail.com

函数式程序设计 过程式语言面向命令,函数式语言面向表达式 函数式语言避免繁琐的内存管理 函数式语言要求写出可靠正确的程序 函数式语言的几个概念 函数,递归,模式匹配,多态类型检测,高阶函数,无穷数据结构,惰性求值

ML与纯函数式编程语言的区别   ML是非纯函数式语言 热情求值 没有无穷数据结构 模块 …… 多态类型检测 异常处理 简单的IO指令 ……

ML的诞生 ML(Meta-Language) 是一个通用的函数式编程语言,它是由 爱丁堡大学的Robin Milner在二十世纪七十年代晚期开发的, 现在流行的方言有Standard ML和Caml. 启发语言:ISWIM 影响语言:Miranda, Haskell, Cyclone, C++, F#, Clojure, Felix, Opa, Erlang …… 设计初衷:LCF定理证明机中寻找证明策略 ML大多被用于语言设计和操作(编译器、分析器、定理证明 机), 但是它作为通用语言也被用于生化,金融系统,和 宗谱数据库,一个P2P的客户/服务器程序等等。

Level 0 猿 Hello world 阶乘函数 “Hello world!”; (*make a string*) print it; (*output it*) 阶乘函数 fun fac 0 = 1 | fac n = n * fac (n - 1); Level Up! 猿 LV.0 ML Programmer LV.1 ML Programmer

Level 1 值的声明 命名常量 声明函数 标识符 val pi = 3.14159; fun circle_area (r) = pi*r*r; 标识符 字母开头,允许数字、下划线、撇号’ !%&$#+_*/:<=>?@\~`^|

Level 1 ↓ 基本类型 数 字符串 真值 int, real + - * div mod ~ 负号 类型约束 连接符^ #”0”和“0” 真值 orelse, andalso, not if E then E1 else E2 - fun square x = x*x; ↓ - fun square x = x*x :real;

Level 1 猿 序偶、元组、记录 序偶 记录 Level Up! 向量(2.5 , ~1.2) : real*real type vec = real * real; 记录 val ZS = {name=“Zhang San”, age=20, major=“CS”}; #age ZS; > 20 : int Level Up! 猿 LV.1 ML Programmer LV.2 ML Programmer

Level 2 表达式 局部声明 中缀操作符(infix operator)及其优先级、结合方式 传值调用(add….) let ... in ... end local ... in ... end 支持嵌套

(* Example for infix operator *) infix xor; fun (p xor q) = (p orelse q) andalso not (p andalso q); (* 中缀优先级 *) infix 7 times; (* 传值调用 *) sqr(sqr(sqr(2))) zero(sqr(sqr(sqr(2))) =sqr(sqr(2*2)) =zero(sqr(sqr(2*2))) =sqr(sqr(4)) =zero(sqr(sqr(4))) =sqr(4*4) =zero(sqr(4*4)) =sqr(16) =zero(sqr(16)) =16*16 =zero(16*16) =256 =zero(256) =0 .

猿 Level Up! (* Example for let ... in ... end *) fun fraction (n,d) = let val com = gcd(n,d) in (n div com, d div com) end; > val fraction = fn : int * int -> int * int (* Example for local ... in ... end *) local fun itfib (n, prev, curr) : int = if n=1 then curr else itfib (n-1, curr, prev+curr) in fun fib (n) = itfib(n, 0, 1) > val fib = fn ; int -> int Level Up! 猿 LV.2 ML Programmer LV.3 ML Programmer

Level 3 模块系统 结构 通过Conplex.zero这样的形式来访问 不同结构里的标识符可以相同 签名

猿 Level Up! LV.4 LV.3 ML Programmer ML Programmer structure Complex : ARITH = struct type t = real*real; val zero = (0.0, 0.0); fun sum ((x,y), (x',y')) = (x+x', y+y') : t; fun diff ((x,y), (x',y')) = (x-x', y-y') : t; fun prod ((x,y), (x',y')) = (x*x' - y*y', x*y' + x'*y) : t; fun recip (x,y) = let val t:real = x*x + y*y in (x/t, ~y/t) end fun quo (z,z') = prod(z, recip z'); end; signature ARITH = sig type t val zero : t val sum : t * t -> t val diff : t * t -> t val prod : t * t -> t val quo : t * t -> t Level Up! 猿 LV.3 ML Programmer LV.4 ML Programmer

Level 4 猿 多态类型检测 多态类型的声明 关于算法(Damas(1985)的博士论文) Level Up! LV.5 LV.4 - fun pairself x = (x,x); > val pairself = fn : ‘a -> ‘a * ‘a fun fst (x,y) = x; > val fst = fn : ‘a * ‘b -> ‘a fun snd (x,y) = y; > val snd = fn : ‘a * ‘b -> ‘b Level Up! 猿 LV.4 ML Programmer LV.5 ML Programmer

Level 5 猿 List :: _ 顺序 [3, 4] 可重复 [3, 4, 3] 元素类型任意 Level Up! 顺序 [3, 4] 可重复 [3, 4, 3] 元素类型任意 [(1,”one”),(2,”two”),(3,”three”)] : (int*string) list :: 右结合中缀操作符cons 在表前加入一个元素 _ 通配符 Level Up! 猿 LV.5 ML Programmer LV.6 ML Programmer

Level 6 数据类型声明 datatype person = King | Peer of string*string*int | Knight of string | Peasant of string; fun title King = "His Majesty the King“ | title (Peer(deg,terr,_)) = "The " ^ deg ^ " of " ^ terr | title (Knight name) = "Sir " ^ name | title (Peasant name) = name;

Level 6 树 节点=节点+子树or叶子 size(tree) 应用 datatype ‘a tree = Lf | Br of ‘a tree * ‘a tree; size(tree) 应用

val tree2 = Br(2, Br(1,Lf,Lf), Br(3,Lf,Lf)); val tree4 = Br(4, tree2, tree5); 4 2 1 3 5 6 7

(* make a tree *) datatype 'a tree = Lf | Br of 'a * 'a tree * 'a tree; structure Tree = struct fun size Lf = 0 | size (Br(v,t1,t2)) = 1 + size t1 + size t2; fun depth Lf = 0 | depth (Br(v,t1,t2)) = 1 + Int.max (depth t1, depth t2); fun reflect Lf = Lf | reflect (Br(v,t1,t2)) = Br(v, reflect t2, reflect t1); .... end;

(* 二叉查找树 *) (*** Dictionaries as Binary search trees ***)signature DICTIONARY = sig type key (*type of keys*) type 'a t (*type of tables*) exception E of key (*errors in lookup, insert*) val empty: 'a t (*the empty dictionary*) val lookup: 'a t * key -> 'a val insert: 'a t * key * 'a -> 'a t val update: 'a t * key * 'a -> 'a t end; (*Structure Order can vary; Tree avoids referring to a free structure. *) structure Dict : DICTIONARY = struct type key = string; type 'a t = (key * 'a) tree; exception E of key; val empty = Lf;

猿 Level Up! LV.7 LV.6 ML Programmer ML Programmer fun lookup (Lf, b) = raise E b | lookup (Br ((a,x),t1,t2), b) = (case String.compare(a,b) of GREATER => lookup(t1, b) | EQUAL => x | LESS => lookup(t2, b)); fun insert (Lf, b, y) = Br((b,y), Lf, Lf) | insert (Br((a,x),t1,t2), b, y) = GREATER => Br ((a,x), insert(t1,b,y), t2) | EQUAL => raise E b | LESS => Br ((a,x), t1, insert(t2,b,y))); fun update (Lf, b, y) = Br((b,y), Lf, Lf) | update (Br((a,x),t1,t2), b, y) = GREATER => Br ((a,x), update(t1,b,y), t2) | EQUAL => Br ((a,y), t1, t2) | LESS => Br ((a,x), t1, update(t2,b,y))); end; Level Up! 猿 LV.6 ML Programmer LV.7 ML Programmer

后期升级攻略 函数与算子 实现惰性求值 实现搜索策略 函数式程序正确性的证明 抽象类型(用于建立大型系统) ML中的命令式程序设计 应用:LAMBDA演算解释器

总结 用ML可以很容易写出清晰、可靠的程序。值得作为函数式编程的入门语言。 在牺牲部分效率的情况下,提升程序的安全性是十分必要的。因为在函数式编程里,正确性第一,清晰性次之,效率排在第三位。 ML在运行前会检查所有的类型和接口以防止出错,让程序员将更多的精力放在丰富语言上,而不是冗长又无用的调试和测试。 ML远没有这次所展示的这么少,它的强大之处还待继续去深入地了解。

参考资料 ML for the Working Programmer Second Edition, Lawrence C. Paulson en.Wikipedia.org - ML (programming language) Functional programming 3. A Gentle Introduction to ML, Andrew Cumming, Computer Studies, Napier University 4. The ML Language - Typed Functional Programming with Assignments

问答 谢谢聆听