跳至內容

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可以同時作為模塊名、類名與構造符。