ML语言的从例子看ML编程风格
答案:1 悬赏:50 手机版
解决时间 2021-03-23 20:46
- 提问者网友:雾里闻花香
- 2021-03-23 05:26
ML语言的从例子看ML编程风格
最佳答案
- 五星知识达人网友:千杯敬自由
- 2021-03-23 05:35
通常大家学习编程都是从命令式语言开始的。和函数示语言不同,命令式语言以语句作为基本单位。Algol家族的所有语言都是命令式语言,ML也不例外。因此学习ML不像学习Scheme那样需要完全转换一套思路。但是ML继承了函数式语言的很多特征,而且也有自己的一些特点。 程序中总要定义数据结构。常用的定长线性结构包括:Pascal的record,C的struct,C++和Java的class。在ML中我们通常用tuple,即用圆括号括起来的,用逗号分隔的若干项元素。
Tuple是个线性结构,可以用整数索引。比如
#1(1, 2.0, apple) = 1
#2(1, 2.0, apple) = 2.0
#3(1, 2.0, apple) = apple
和Algol类语言的数组不同的是,tuple中各个元素的类型可以不一样。
C++的boost模板库中提供了一个模板tuple,模仿ML/Scheme的tuple,使C++程序员可以将不同类型的数据组织成一个便于访问的线性结构。 ML和大多数Algol类语言一样支持函数的嵌套定义(包括Algol 60、Algol 68和Pascal,但是C是例外)。
如果函数A和函数B互相嵌套调用(indirect recursion),则源程序中可以将B的函数体定义在 A的函数体内,或者A的定义在B的函数体内。具体采用那一种,要看外界是调用A还是B。
函数addqueen和其内部函数try就是这样的例子。显然addqueen是要被外部调用的。 大多数Algol类语言对机器的抽象是以内存为中心的,即变量和对象(object)对应内存中的存储区域,赋值语句对应机器的访存操作,所以程序中有大量的赋值语句。ML也支持赋值,但是通常建议采取的风格是类似Lisp和Scheme的纯表达式风格,避免赋值操作。
例如如果用C来描述n皇后问题,通常我们会设计一个数据结构描述棋盘(和ML程序一样),然后定义这个数据结构的一个实例(可能是个全局变量)。算法的主要工作是通过赋值修改这个实例的内容。
而例子中的ML代码中经典的一段是函数place。这是修改棋盘数据结构的代码。但是并没有使用赋值,而是产生了一个新的数据结构实例,其内容和参数略有区别(放上了一个新的皇后)。
纯表达式的使用要求程序员先对程序考虑得非常细致才能动笔(动手?),因此使得程序逻辑更加清晰。(这和literate programming的思想是一致的。)但是目前的硬件机器是以内存为中心设计的,所以纯表达式语言的实现(编译器和解释器)的效率依靠于设计者多费心思。ML就是通过静态作用域(statically scoping)和uniform data representation等特点结合起来达到高效的。
Tuple是个线性结构,可以用整数索引。比如
#1(1, 2.0, apple) = 1
#2(1, 2.0, apple) = 2.0
#3(1, 2.0, apple) = apple
和Algol类语言的数组不同的是,tuple中各个元素的类型可以不一样。
C++的boost模板库中提供了一个模板tuple,模仿ML/Scheme的tuple,使C++程序员可以将不同类型的数据组织成一个便于访问的线性结构。 ML和大多数Algol类语言一样支持函数的嵌套定义(包括Algol 60、Algol 68和Pascal,但是C是例外)。
如果函数A和函数B互相嵌套调用(indirect recursion),则源程序中可以将B的函数体定义在 A的函数体内,或者A的定义在B的函数体内。具体采用那一种,要看外界是调用A还是B。
函数addqueen和其内部函数try就是这样的例子。显然addqueen是要被外部调用的。 大多数Algol类语言对机器的抽象是以内存为中心的,即变量和对象(object)对应内存中的存储区域,赋值语句对应机器的访存操作,所以程序中有大量的赋值语句。ML也支持赋值,但是通常建议采取的风格是类似Lisp和Scheme的纯表达式风格,避免赋值操作。
例如如果用C来描述n皇后问题,通常我们会设计一个数据结构描述棋盘(和ML程序一样),然后定义这个数据结构的一个实例(可能是个全局变量)。算法的主要工作是通过赋值修改这个实例的内容。
而例子中的ML代码中经典的一段是函数place。这是修改棋盘数据结构的代码。但是并没有使用赋值,而是产生了一个新的数据结构实例,其内容和参数略有区别(放上了一个新的皇后)。
纯表达式的使用要求程序员先对程序考虑得非常细致才能动笔(动手?),因此使得程序逻辑更加清晰。(这和literate programming的思想是一致的。)但是目前的硬件机器是以内存为中心设计的,所以纯表达式语言的实现(编译器和解释器)的效率依靠于设计者多费心思。ML就是通过静态作用域(statically scoping)和uniform data representation等特点结合起来达到高效的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯