Haskell2010中文报告/语言/简介

维基教科书,自由的教学读本

Haskell是通用的纯函数式语言,集成了当前在程序设计语言上的许多创新。Haskell提供高阶函数、非即时语义、静态多型类型系统、用户定义代数类型、模式匹配、列表组合、模块系统、单子化I/O函数、丰富的原始库包含列表、数组、任意精度及固定精度整数、浮点数。Haskell是多年函数式程序语言最高设计水平的代表成果。

本报告定义Haskell程序的语法以及程序的非形式操作语义。

我们不关心Haskell程序的具体运行方式以及与Haskell实现相关的的问题。比如程序的解释、编译、变换,也包括编程环境相关的问题、无定义程序(即形式求值到⊥程序)的错误返回信息等。

程序结构[编辑]

本节,我们论述Haskell的抽象语法与语义结构,以及结构与报告其它部分的关系。

  1. 在最上层,Haskell是模块的集合。模块在模块节论述。模块提供命名空间,是大程序中软件重用的主要方法。
  2. 模块的上层包含声明的集合。声明有多种,在声明和绑定节论述。声明定义诸如常规值、数据类型、类型信息及结合信息等。
  3. 再下面一层定义表达式。表达式在表达式节论述。表达式表示一个值,并有一个静态类型。“小范围而言”,表达式是Haskell程序的核心。
  4. 最下层是Haskell词法结构。词法结构在词法结构节论述。词法结构是Haskell程序在文本文件中的具体表示。

本报告根据Haskell文法结构自底向上论述。

上面没有提到的预定义类型和类节描述Haskell内建的数据类型和类型类。基本输入输出节讨论Haskell中的I/O设施(即,Haskell怎样与外部世界通信)。另外,还有几节讲述Prelue具体文法、作文式编程、派生设立规范、被大多数编译器支持的编译器指示等。

Haskell程序样例用打印机字体表示:

 let x = 1  
     z = x+y  
 in  z+1

”孔“,在程序样片中表示任意大小的样例,用斜体表示,比如if e1 then e2 else e3。通常,斜体名字有助记含义,比如e表达式expressions, d声明declarationst类型type等。

Haskell核[编辑]

流行于许多函数式编程中的便利语法也被Haskell采用。在本报告中,这些语法糖被转换为更简单的结构。如果反复应用这些转换,程序最终可认为是Haskell的一个小子集所编写,这个小子集我们称为Haskell核。

虽然Haskell核没有被形式定义,但它实际上是增加一些修饰的lambda演算变体,有直接的指称语义。在我们介绍语法结构时,我们也给出语法结构到Haskell核的转换。这种模块化的设计方便我们推理Haskell程序,也为语言的实现者提供了有用的参考。

值和类型[编辑]

表达式求值到值,有静态类型。Haskell中,值和类型并不混合。然而,类型系统允许各种用户定义的数据类型,不仅允许参数化多型(使用传统的Hindley-Milner类型结构),也允许临时多型,或者称为重载(使用类型类)。

Haskell中,错误和⊥("底")语义等价。技术上,这两者看起来就像非终止,因此语言没有检测或处理错误的机制。而语言的实现通常都会对错误提供一些有用信息,具体请见错误节。

名字空间[编辑]

Haskell中,名字有6种:变量构造符表示值;类型变量类型构造符类型类是类型系统中的实体;模块名属于模块系统。在命名时有两个约束:

变量名和类型变量名以小写字母或者下划线开头,其它四种名字以大写字母开头。

在同一作用域内,标示符不能用来做类型构造符或者类型类。

这些也仅仅只是约束:举个例子,在同一作用域内,Int可以同时作为模块名、类名与构造符。