ML语言 百科内容来自于: 百度百科

ML语言简介

ML一般被归为非纯函数式编程语言因为它允许副作用和指令式编程这一点和纯函数式编程语言??例如Haskell??很不一样
ML特性有惰性求值的求值策略一阶类型函数 带有垃圾收集的自动内存管理参数多态静态数据类型类型推断代数数据类型模式匹配和异常处理
不像HaskellML使用热情求值也就是说所有的子表达式总是被求值导致的一个结果是你不能使用无穷表然而惰性求值产生的无穷表可以通过使用匿名函数来模拟
今天在ML家族中有好几种语言两种主要的方言是Standard ML和Caml其他的包括F# - 针对Microsoft .NET平台的开放研究项目 ML中的思想影响了众多的语言例如HaskellCyclone和Nemerle  ML的实力大多被用于语言设计和操作编译器分析器定理证明机 但是它作为通用语言也被用于生化金融系统和宗谱数据库一个P2P的客户/服务器程序等等
ML可以算一种具备命令式语言特点的函数型语言或者说面向函数的命令型语言和Lisp一样ML具有非常灵活的函数功能例如一个表达式的值可能就是一个函数这个函数可以被作为参数传递给另一个函数或者函数的返回值就是一个函数同时和Algol类的语言比较接近的是ML的语法象命令型的而且用起来象用Algol家族的很多比较新的后代们一样方便而且ML有并行扩展可以用来写并行系统甚至还有面向对象扩展
John C. Mitchell在他的Concepts in Programming Langugaes一书中使用ML来展示Algol类语言Lisp类语言以及并行语言和面向对象语言中的概念
ML是Robin Milner主管LCF项目时设计的LCF项目是受Dana Scott给出的一组逻辑原则启发而设立的致力于开发一种可计算函数逻辑Logic of Computable FunctionsRobin Milner的目标是构造一个方便实用的系统来自动的或者半自动的证明函数程序中一些有趣的性质他的LCF项目于1970年在Standford开始并于1980年代在Edinburge继续进行期间取得了很多重要进展并且激发了相关领域的一系列研究工作
ML是作为LCF项目的元语言Meta Language设计的这也是其名字的来历它的最初用途是写一些可以生成数学证明的程序今天大多数著名的推理系统都是用ML写的
目前ML有两个发展分支Standard ML和Caml
大多数SML编译器的行为方式都是交互式的用户一条一条输入语句编译器一一给出反馈看起来象Logo或者Basic解释器一样但是其实用户输入的程序是被先编译再执行的其中细节大家可以从SML/NJ编译器的相关文档和论文中找到

ML的相关资源

最著名的SML编译器Standard ML New Jersey的官方网站其中还可以找到很多SML相关的内容
教科书Programming in Standard ML
将Emacs作为SML的开发环境
目前有两个常用的SML的Emacs mode一个是 Stefan Monnier写的功能强大一些可以从这里下 载SML/NJ的网站上有它的文档
SML的Basic Library文档
如果要用ML写能实际干点事情的程序离了Standard ML Basic Library是不行的SML/NJ编译器安装时已经包含了Basic Library你可以直接使用

ML编程环境的配置

在Windows环境下使用Emacs作为ML的集成开发环境下面关于Emacs和SML在Windows下的配置说明其实同样适合于各种Unix类操作系统这里有一副抓图在左边的frame中编辑好SML源程序后按下C-c C-b程序就交付给运行在右边frame中的SML编译器了你也可以直接在右边的frame中交互式的输入SML程序
为了配置这个环境我安装了GNU Emacs for Windows你也可以用XEmacs for WindowsSML编译器SML/NJ你也可以用其他编译器比如Moscow MLPoly/MLEmacs的SML mode安装和配置步骤如下
下载和安装GNU Emacs for Windows
下载和安装SML New Jersey编译器
下载和安装Emacs的SML major mode具体的方法如下
在你的Emacs安装目录例如F:\Program Files\emacs-21.3下建一个子目录叫site-lisp如果已经有了就不用建了
在其中建一个子目录叫sml-mode
将你下载的SML major mode压缩包解开将其中所有.el文件拷贝到site-lisp/sml-mode子目录下
编辑site-lisp中的site-start.el加入两行
(add-to-list 'load-path "F:/Program Files/emacs-21.3/site-lisp/sml-mode")
(load "sml-mode-startup")
在PATH环境变量里包含SML编译器所在的目录我的是f:\sml\bin
启动Emacs后敲 M-x run-sml就可以在Emacs中启动一个SML交互环境
如果用 M-x sml-mode就将当前buffer的major mode设置为sml-mode你会发现其中的SML代码被语法高亮显示了如果没有语法高亮你可以在Emacs的配置文件对于Windows版本的GNU Emacs和XEmacs而言是C:\.emacs对Unix版本的是~/.emacs中加入一行
Syntax highlight
(global-font-lock-mode t)

从例子看ML编程风格

通常大家学习编程都是从命令式语言开始的和函数示语言不同命令式语言以语句作为基本单位Algol家族的所有语言都是命令式语言ML也不例外因此学习ML不像学习Scheme那样需要完全转换一套思路但是ML继承了函数式语言的很多特征而且也有自己的一些特点

线性数据结构

程序中总要定义数据结构常用的定长线性结构包括Pascal的recordC的structC++和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 60Algol 68和Pascal但是C是例外
如果函数A和函数B互相嵌套调用indirect recursion则源程序中可以将B的函数体定义在 A的函数体内或者A的定义在B的函数体内具体采用那一种要看外界是调用A还是B
函数addqueen和其内部函数try就是这样的例子显然addqueen是要被外部调用的

用尾部递归tail recursion代替循环

如果用Algol类语言例如 Pascal和C来写函数addqueen其中需要一个循环从某行的第一个位置开始判断如果在这个位置上放一个皇后是否可以使得其不和前面已经放上的皇后冲突而且后面还可以继续放满皇后而ML中这个循环用递归函数tryARow表示

纯表达式pure expression风格

大多数Algol类语言对机器的抽象是以内存为中心的即变量和对象object对应内存中的存储区域赋值语句对应机器的访存操作所以程序中有大量的赋值语句ML也支持赋值但是通常建议采取的风格是类似Lisp和Scheme的纯表达式风格避免赋值操作
例如如果用C来描述n皇后问题通常我们会设计一个数据结构描述棋盘和ML程序一样然后定义这个数据结构的一个实例可能是个全局变量算法的主要工作是通过赋值修改这个实例的内容
而例子中的ML代码中经典的一段是函数place这是修改棋盘数据结构的代码但是并没有使用赋值而是产生了一个新的数据结构实例其内容和参数略有区别放上了一个新的皇后
表达式的使用要求程序员先对程序考虑得非常细致才能动笔动手因此使得程序逻辑更加清晰这和literate programming的思想是一致的但是目前的硬件机器是以内存为中心设计的所以纯表达式语言的实现编译器解释器的效率依靠于设计者多费心思ML就是通过静态作用域statically scoping和uniform data representation等特点结合起来达到高效的
$firstVoiceSent
- 来自原声例句
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定