跳至內容

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