Haskell2010中文报告/语言/简介
Haskell是通用的纯函数式语言,集成了当前在程序设计语言上的许多创新。Haskell提供高阶函数、非即时语义、静态多型类型系统、用户定义代数类型、模式匹配、列表组合、模块系统、单子化I/O函数、丰富的原始库包含列表、数组、任意精度及固定精度整数、浮点数。Haskell是多年函数式程序语言最高设计水平的代表成果。
本报告定义Haskell程序的语法以及程序的非形式操作语义。
我们不关心Haskell程序的具体运行方式以及与Haskell实现相关的的问题。比如程序的解释、编译、变换,也包括编程环境相关的问题、无定义程序(即形式求值到⊥程序)的错误返回信息等。
程序结构[编辑]
本节,我们论述Haskell的抽象语法与语义结构,以及结构与报告其它部分的关系。
- 在最上层,Haskell是模块的集合。模块在模块节论述。模块提供命名空间,是大程序中软件重用的主要方法。
- 模块的上层包含声明的集合。声明有多种,在声明和绑定节论述。声明定义诸如常规值、数据类型、类型信息及结合信息等。
- 再下面一层定义表达式。表达式在表达式节论述。表达式表示一个值,并有一个静态类型。“小范围而言”,表达式是Haskell程序的核心。
- 最下层是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声明declarations,t类型type等。
Haskell核[编辑]
流行于许多函数式编程中的便利语法也被Haskell采用。在本报告中,这些语法糖被转换为更简单的结构。如果反复应用这些转换,程序最终可认为是Haskell的一个小子集所编写,这个小子集我们称为Haskell核。
虽然Haskell核没有被形式定义,但它实际上是增加一些修饰的lambda演算变体,有直接的指称语义。在我们介绍语法结构时,我们也给出语法结构到Haskell核的转换。这种模块化的设计方便我们推理Haskell程序,也为语言的实现者提供了有用的参考。
值和类型[编辑]
表达式求值到值,有静态类型。Haskell中,值和类型并不混合。然而,类型系统允许各种用户定义的数据类型,不仅允许参数化多型(使用传统的Hindley-Milner类型结构),也允许临时多型,或者称为重载(使用类型类)。
Haskell中,错误和⊥("底")语义等价。技术上,这两者看起来就像非终止,因此语言没有检测或处理错误的机制。而语言的实现通常都会对错误提供一些有用信息,具体请见错误节。
名字空间[编辑]
Haskell中,名字有6种:变量与构造符表示值;类型变量、类型构造符与类型类是类型系统中的实体;模块名属于模块系统。在命名时有两个约束:
变量名和类型变量名以小写字母或者下划线开头,其它四种名字以大写字母开头。
在同一作用域内,标示符不能用来做类型构造符或者类型类。
这些也仅仅只是约束:举个例子,在同一作用域内,Int可以同时作为模块名、类名与构造符。