ML语言(二).ppt_第1页
ML语言(二).ppt_第2页
ML语言(二).ppt_第3页
ML语言(二).ppt_第4页
ML语言(二).ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3.4 标准表函数,在SML中,表操作函数适用于元素类型任意的表。 SML中用字母前加一个单引号来表示一种不确定的类型,例如a, b, c, 这样一个任意类型的表的类型就可以表示为a list 。 SML提供了以下三种运算:,-1-,3.4 标准表函数,-2-,以上三种运算符是“多态的”,因为它们可以作用在任意类型的表上。,3.5 字符、字符串和表,SML没有提供专门的字符类型,字符可以表示为长度为1的字符串。 标准函数ord:将单字符串(长度为1的字符串)转换为该字符对应的ASCII码 标准函数chr:将ASCII码转换为相应的单字符串 标准函数explode:将字符串拆成单字符串组成的表

2、标准函数implode:将字符串表合并为一个字符串,-3-,3.5 字符、字符串和表,-4-,3.6 比较运算符,SML提供了多种重载的中缀比较运算符。 “=”、“”用来测试相等和不相等,布尔型、整型、字符串类型、表和元组型对象适用; 小于()小于等于(=)只适用于数字和字符串(以字母表顺序决定) 如: - “honey” true : bool 注:返回值是布尔型,参数类型必须一致。,3.7 元组、记录运算符,SML提供用于访问元组和记录中元素的函数: 用“#”访问元组和记录中的元素 对于元组,用#加上要访问数据的序号,从1开始; 对于记录,用#加上要访问数据的名字。 例子:,- # 2(1

3、,2,3,4,5,6); 2:int - # 3 (“张”, “王”, “李” ,“赵”); “李”: string,- # First_name(First_name=“Bred”,Last_name=“Pett”); “Bred” : string,4.ML函数定义,SML语言程序是通过函数作用来解决问题的。函数是SML的核心。 4.1 函数的形式 4.2 约束变量和类型 4.3 全局定义 4.4 条件表达式 4.5 递归和函数定义 4.6 访问元组约束变量中的元素 4.7 模式匹配 4.8 局部定义,-7-,4.1 函数,在SML 语言中,函数的形式如下: fn = 约束变量(bound

4、 variable)自变量,必须是一个 字母-数字 标识符(以字母打头,由字母、数字和下划线组成的字符串) 例子: oxymoron,Home_on_the_range,Highway61,-8-,4.1 函数,下面定义的函数将约束变量的值加1作为他的返回值。 - fn x = x+1; fn : int - int 再看一例: - fn (x,y) = not(x orelse y); fn : (bool*bool) - bool SML自动推导函数定义域和值域类型的过程,-9-,4.2约束变量的类型,设想一个平方函数:fn x = x*x; SML会拒绝该函数定义why?如何解决? 约束

5、变量类型可以通过在其后直接写明类型的方法来加以明确。其写法如下: : 例子: - fn (x:int) = x*x; fn : int - int,-10-,4.2约束变量的类型,平方和函数定义为: - fn (x:int,y:int) = x*x + y*y; fn : (int * int) - int 显示地说明约束变量的类型是一种好习惯,这样可以增加函数的可读性并使类型保持一致。在SML中,类型表达式容易变得很长,以至于无法控制。因此,SML提供了定义新的复杂类型的方法,我们将在后面介绍。,-11-,4.3 全局定义,全局定义可以这样建立: val = 例如: - val sq = f

6、n (x:int) = x*x; val sq = fn : int - int - val sum_sq = fn (x:int , y:int) = x*x + y*y; val sum_sq = fn : (int * int ) - int 注意,作为对定义的承认,SML系统会显示定义的名称和表达式的值及类型。定义的名称可用于以后的表达式,例如:,-12-,4.3 变量定义,- sq 3; 9:int 和以后的定义式,例如: - val sum_sq = fn (x:int , y:int) = (sq x) + (sq y); val sum_sq = fn : (int * int

7、) - int,-13-,4.4 条件表达式,SML中条件表达式的写法如下: if then else 注意,在ML中不允许使用没有else的if-then形式 其中,表达式1的值为布尔值,表达式2、3作为选项表达式必须具有相同的类型。例如,要取两数字之中的大者: - val max = fn (x:int,y:int)=if xy then x else y; val max = fn:(int * int)-int,-14-,4.5 递归和函数定义,定义递归函数时,需在函数名前面加上rec。例如,求整数表长: - val rec length = fn (l:int list) = if

8、l = then 0 else 1+ (length(tl l); val length = fn:(int list) - int SML支持一种比较简单的函数定义的书写格式,用fun代替val,fn被省略了,约束变量移到了=左边而=也被省略了。如果是递归定义,则“rec”也被省略了。,-15-,4.5 递归和函数定义,即: fun = 与 val rec = fn = 等价 上例可以写成: - fun length (l:int list) = if l = then 0 else 1+ (length(tl l); val length = fn:(int list) - int,-16

9、-,4.6 访问元组约束变量中的元素,当约束变量是元组时,函数可以访问元组的元素。例如,从学生信息元组中选择姓名、住址和学号:,-17-,4.6 访问元组约束变量中的元素,为了避免书写那些在函数体内用不着的约束变量,SML提供了匿名变量(_)。它的作用相当于一个任意类型的无名变量。我们可以利用它来重写上面的例子:,-18-,4.6 访问元组约束变量中的元素,为了对嵌套的元组元素进行访问,我们使用了嵌套的约束变量元组。例如,从学生信息中分别选则姓和名:,-19-,4.7 模式匹配,SML的函数定义可以使用约束变量模式。 所谓模式就是对表达式的结构的描述。 模式可以利用变量、常量及构造子(cons

10、tructor)。 构造子指的是任何类型的常量或数据结构名。 我们可以利用模式匹配来重写整数表的表头、表尾函数,-20-,4.7 模式匹配,其中的:是作为表的构造子用于约束变量模式的。该函数在遇到空表作为参数时会崩溃,因为空表不能匹配定义中的模式。 在SML中,通常采用case风格的模式匹配函数定义,而不是在函数体内使用条件语句。前一种函数定义方法,称之为子句定义,其形式如下: 在此,每一个 = 定义了一种情况。,-21-,4.7 模式匹配,注意每种情况的定义顺序是重要的。当一个子句定义函数作用到一个参量上的时候,就按定义的次序依次将参数与模式进行匹配,直到有一个模式匹配成功为止。考虑下面的例子,我们构造一个函数,他返回朝鲜半岛国家的首都。该函数采用了常量模式匹配定义: 当该函数作用到一个参数上去的时候,这个参数就会与函数定义中的所有常量模式进行匹配,直到与其中一个匹配成功,或者是最终匹配了匿名变量。,-22-,4.8 局部定义,SML用letin来表示局部定义: 该语句将返回的值。而在的求值过程中,以的值取代出现在中的。这就是说,是一个局部定义,他的有效范围就在letin语句之中。,-23-,4.8 局部定义,对于函数局部定义: 其中定义的函数在中可以使用。例如,下面

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论