ML语言二.pptx

上传人:b****1 文档编号:1399670 上传时间:2022-10-22 格式:PPTX 页数:25 大小:670.34KB
下载 相关 举报
ML语言二.pptx_第1页
第1页 / 共25页
ML语言二.pptx_第2页
第2页 / 共25页
ML语言二.pptx_第3页
第3页 / 共25页
ML语言二.pptx_第4页
第4页 / 共25页
ML语言二.pptx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

ML语言二.pptx

《ML语言二.pptx》由会员分享,可在线阅读,更多相关《ML语言二.pptx(25页珍藏版)》请在冰豆网上搜索。

ML语言二.pptx

3.4标准表函数,在SML中,表操作函数适用于元素类型任意的表。

SML中用字母前加一个单引号来表示一种不确定的类型,例如a,b,c,这样一个任意类型的表的类型就可以表示为alist。

SML提供了以下三种运算:

-1-,3.4标准表函数,-2-,以上三种运算符是“多态的”,因为它们可以作用在任意类型的表上。

3.5字符、字符串和表,SML没有提供专门的字符类型,字符可以表示为长度为1的字符串。

标准函数ord:

将单字符串(长度为1的字符串)转换为该字符对应的ASCII码标准函数chr:

将ASCII码转换为相应的单字符串标准函数explode:

将字符串拆成单字符串组成的表标准函数implode:

将字符串表合并为一个字符串,-3-,3.5字符、字符串和表,-4-,3.6比较运算符,SML提供了多种重载的中缀比较运算符。

“=”、“”用来测试相等和不相等,布尔型、整型、字符串类型、表和元组型对象适用;小于()小于等于(=)只适用于数字和字符串(以字母表顺序决定)如:

-“honey”true:

bool注:

返回值是布尔型,参数类型必须一致。

3.7元组、记录运算符,SML提供用于访问元组和记录中元素的函数:

用“#”访问元组和记录中的元素对于元组,用#加上要访问数据的序号,从1开始;对于记录,用#加上要访问数据的名字。

例子:

-#2(1,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=约束变量(boundvariable)自变量,必须是一个字母-数字标识符(以字母打头,由字母、数字和下划线组成的字符串)例子:

oxymoron,Home_on_the_range,Highway61,-8-,4.1函数,下面定义的函数将约束变量的值加1作为他的返回值。

-fnx=x+1;fn:

int-int再看一例:

-fn(x,y)=not(xorelsey);fn:

(bool*bool)-boolSML自动推导函数定义域和值域类型的过程,-9-,4.2约束变量的类型,设想一个平方函数:

fnx=x*x;SML会拒绝该函数定义why?

如何解决?

约束变量类型可以通过在其后直接写明类型的方法来加以明确。

其写法如下:

例子:

-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=例如:

-valsq=fn(x:

int)=x*x;valsq=fn:

int-int-valsum_sq=fn(x:

int,y:

int)=x*x+y*y;valsum_sq=fn:

(int*int)-int注意,作为对定义的承认,SML系统会显示定义的名称和表达式的值及类型。

定义的名称可用于以后的表达式,例如:

-12-,4.3变量定义,-sq3;9:

int和以后的定义式,例如:

-valsum_sq=fn(x:

int,y:

int)=(sqx)+(sqy);valsum_sq=fn:

(int*int)-int,-13-,4.4条件表达式,SML中条件表达式的写法如下:

ifthenelse注意,在ML中不允许使用没有else的if-then形式其中,表达式1的值为布尔值,表达式2、3作为选项表达式必须具有相同的类型。

例如,要取两数字之中的大者:

-valmax=fn(x:

int,y:

int)=ifxythenxelsey;valmax=fn:

(int*int)-int,-14-,4.5递归和函数定义,定义递归函数时,需在函数名前面加上rec。

例如,求整数表长:

-valreclength=fn(l:

intlist)=ifl=then0else1+(length(tll);vallength=fn:

(intlist)-intSML支持一种比较简单的函数定义的书写格式,用fun代替val,fn被省略了,约束变量移到了=左边而=也被省略了。

如果是递归定义,则“rec”也被省略了。

-15-,4.5递归和函数定义,即:

fun=与valrec=fn=等价上例可以写成:

-funlength(l:

intlist)=ifl=then0else1+(length(tll);vallength=fn:

(intlist)-int,-16-,4.6访问元组约束变量中的元素,当约束变量是元组时,函数可以访问元组的元素。

例如,从学生信息元组中选择姓名、住址和学号:

-17-,4.6访问元组约束变量中的元素,为了避免书写那些在函数体内用不着的约束变量,SML提供了匿名变量(_)。

它的作用相当于一个任意类型的无名变量。

我们可以利用它来重写上面的例子:

-18-,4.6访问元组约束变量中的元素,为了对嵌套的元组元素进行访问,我们使用了嵌套的约束变量元组。

例如,从学生信息中分别选则姓和名:

-19-,4.7模式匹配,SML的函数定义可以使用约束变量模式。

所谓模式就是对表达式的结构的描述。

模式可以利用变量、常量及构造子(constructor)。

构造子指的是任何类型的常量或数据结构名。

我们可以利用模式匹配来重写整数表的表头、表尾函数,-20-,4.7模式匹配,其中的:

是作为表的构造子用于约束变量模式的。

该函数在遇到空表作为参数时会崩溃,因为空表不能匹配定义中的模式。

在SML中,通常采用case风格的模式匹配函数定义,而不是在函数体内使用条件语句。

前一种函数定义方法,称之为子句定义,其形式如下:

在此,每一个=定义了一种情况。

-21-,4.7模式匹配,注意每种情况的定义顺序是重要的。

当一个子句定义函数作用到一个参量上的时候,就按定义的次序依次将参数与模式进行匹配,直到有一个模式匹配成功为止。

考虑下面的例子,我们构造一个函数,他返回朝鲜半岛国家的首都。

该函数采用了常量模式匹配定义:

当该函数作用到一个参数上去的时候,这个参数就会与函数定义中的所有常量模式进行匹配,直到与其中一个匹配成功,或者是最终匹配了匿名变量。

-22-,4.8局部定义,SML用letin来表示局部定义:

该语句将返回的值。

而在的求值过程中,以的值取代出现在中的。

这就是说,是一个局部定义,他的有效范围就在letin语句之中。

-23-,4.8局部定义,对于函数局部定义:

其中定义的函数在中可以使用。

例如,下面的组合函数C(I,N)=N!

/(I!

*(N-I)!

)的定义中就用到了局部变量的阶乘函数。

-24-,5.SML类型,在SML中,类型表达式容易变得很长,以至于无法控制因此SML提供了定义新的复杂类型的方法。

在本节我们将讨论SML的类型系统。

5.1类型表达式和类型缩写5.2类型变量和多态性5.3定义新类型,-25-,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1