ML语言二PPT资料.pptx
《ML语言二PPT资料.pptx》由会员分享,可在线阅读,更多相关《ML语言二PPT资料.pptx(25页珍藏版)》请在冰豆网上搜索。
小于()小于等于(=)只适用于数字和字符串(以字母表顺序决定)如:
-“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);
(bool*bool)-boolSML自动推导函数定义域和值域类型的过程,-9-,4.2约束变量的类型,设想一个平方函数:
fnx=x*x;
SML会拒绝该函数定义why?
如何解决?
约束变量类型可以通过在其后直接写明类型的方法来加以明确。
其写法如下:
-fn(x:
int)=x*x;
int-int,-10-,4.2约束变量的类型,平方和函数定义为:
int,y:
int)=x*x+y*y;
(int*int)-int显示地说明约束变量的类型是一种好习惯,这样可以增加函数的可读性并使类型保持一致。
在SML中,类型表达式容易变得很长,以至于无法控制。
因此,SML提供了定义新的复杂类型的方法,我们将在后面介绍。
-11-,4.3全局定义,全局定义可以这样建立:
val=例如:
-valsq=fn(x:
valsq=fn:
int-int-valsum_sq=fn(x:
valsum_sq=fn:
(int*int)-int注意,作为对定义的承认,SML系统会显示定义的名称和表达式的值及类型。
定义的名称可用于以后的表达式,例如:
-12-,4.3变量定义,-sq3;
9:
int和以后的定义式,例如:
-valsum_sq=fn(x:
int)=(sqx)+(sqy);
(int*int)-int,-13-,4.4条件表达式,SML中条件表达式的写法如下:
ifthenelse注意,在ML中不允许使用没有else的if-then形式其中,表达式1的值为布尔值,表达式2、3作为选项表达式必须具有相同的类型。
例如,要取两数字之中的大者:
-valmax=fn(x:
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)-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-,