Can you summarize the following document?
        
  1985年,Miranda發行後,惰性函式式語言的關注度增長。到1987年前,出現了十多種非限定性、純函式式語言。其中,Miranda使用的最為廣泛,但還沒有出現在公共領域。在俄勒岡波特蘭的函數語言程式設計語言與計算機結構大會(FPCA '87)上,參加者一致同意形成一個委員會來為這樣的語言定義一種開放性標準。該委員會旨在整合已有函式式語言,作為將來的函式式語言設計研究工作的基礎。

  1990年定義了Haskell的第一個版本(“Haskell 1.0”)。委員會形成了一系列的語言定義(1.0,1.1,1.2,1.3,1.4)。

  1997年底,該系列形成了Haskell 98,旨在定義一個穩定、最小化、可移植的語言版本以及相應的標準庫,以用於教學和作為將來擴充套件的基礎。委員會明確歡迎建立各種增加或整合實驗性特性的Haskell 98的擴充套件和變種。  1999年2月,Haskell 98語言標準公佈,名為《The Haskell 98 Report》。2003年1月,《Haskell 98 Language and Libraries: The Revised Report》公佈。接著,Glasgow Haskell Compiler (GHC)實現了當時的事實標準,Haskell快速發展。

  2006年早期,開始了定義Haskell 98標準後續的程序,非正式命名為Haskell Prime。這是個修訂語言定義的不斷增補的過程,每年產生一個新的修訂版。第一個修訂版於2009年11月完成、2010年7月釋出,稱作Haskell 2010。

  Haskell 2010加入了外部函式介面(Foreign Function Interface,FFI)允許繫結到其它程式語言,修正了一些語法問題(在正式語法中的改動)並廢除了稱為“n加k模式”(換言之,不再允許形如codice_1的定義)。引入了語言級編譯選項語法擴充套件(Language-Pragma-Syntax-Extension),使得在Haskell原始碼中可以明確要求一些擴充套件功能。Haskell 2010引入的這些擴充套件的名字是DoAndIfThenElse、HierarchicalModules、EmptyDataDeclarations、FixityResolution、ForeignFunctionInterface、LineCommentSyntax、PatternGuards、RelaxedDependencyAnalysis、LanguagePragma、NoNPlusKPatterns。

  Haskell是現有的一門開放的、已釋出標準的,且有多種實現的語言。支援惰性求值、模式匹配、列表解析、型別類和型別多型。它是一門純函數語言程式設計語言,這意味著大體上,Haskell中的函式沒有副作用。Haskell用特定的型別來表達副作用,該型別與函式型別相互獨立。純函式可以操作並返回可執行的副作用的型別,但不能夠執行它們,只有用於表達副作用的型別才能執行這些副作用,Haskell以此表達其它語言中的非純函式。  Haskell擁有一個基於Hindley-Milner型別推論的靜態、強型別系統。Haskell在此領域的主要創新就是加入了型別類(type class),原本設想作為過載的主要方式,在之後發現了更多用途。  Haskell的主要實現GHC是個直譯器,也是個原生程式碼編譯器。它可以在大多數平臺執行,GHC在併發和並行上具有高效能的實現能力,也有豐富的型別系統,如廣義代數資料型別和型別族(Type Families)。  單子是一個抽象型別,可以表達不同種類的計算,包括異常處理、非確定性、語法分析以及軟體事務記憶體,其中一個應用是用於表達副作用的型別。單子定義為普通的資料型別,同時Haskell也為其提供了幾種語法糖。  Haskell有一個活躍的社群,線上上包倉庫Hackage上有豐富的第三方開源庫或工具。

  

  Haskell是強型別語言。 Char的字面值用單引號圍起; 字串即[Char]型別,其字面值用雙引號括起來。 Int通常為32位整型 Integer是無界整型 Float 表示單精度的浮點數 Double 表示雙精度的浮點數 Bool 只有兩種值:True 和 False。

  使用[ ]與逗號分隔符,定義一個list的例項。其元素必須具有相同型別。字串是list的特例。用:把元素與list、其他元素連線(cons)起來。:是右結合的運算子。[1,2,3] 實際上是 1:2:3:[] 的語法糖。兩個 List 合併通過 ++ 運運算元實現。按照索引取得 List 中的元素,可以使用!! 運運算元,索引的下標為 0。List 中的 List 可以是不同長度,但必須得是相同的型別。['K'..'Z']這樣的Range方法快捷定義一個List。[2,4..20]用法給出了Range的第一、第二、最後一個元素。使用 > 和 >= 可以比較 List 的大小。它會先比較第一個元素,若它們的值相等,則比較下一個,以此類推。List常用的函式:  list comprehension是指基於一個List,按照規則產生一個新List,例如:[x*2 | x <- [1..10], x*2 >= 12]

  使用( )與逗號分隔符,定義一個tuple的例項。其元素可以使不同型別,但個數是固定的。  Tuple的型別取決於其中項的數目與其各自元素的型別。單元素的 Tuple 被禁止。

  基本類似於C語言。但使用not表示邏輯非。  基本的 Typeclass:  case expression of pattern -> result

  pattern -> result

  if then else是分段函式定義時的語法糖。與C語言不同,要求必須有else部分。類似於C語言分支語句的情形,叫做pattern matching,例子如下:

  多型型別(Polymorphic types)類似於C++的模板。例如,算術加法:

  lambda 就是匿名函式。寫法是:一個 \ (因為它看起來像是希臘字母λ),後面是用空格分隔的引數,-> 後面是函式體。通常用括號將括起lambda函式,否則它會佔據整個右邊部分。  例如:(\a b -> (a * 30 + 3) / b)  可以在 lambda 中使用模式匹配,但無法為一個引數設定多個模式,如 [] 和 (x:xs)並用。  使用 lambda 可以更明確地表現出值是個函式,可以用來傳遞給其他函式作引數。

  Haskell的所有函式實際上是單引數函式。多引數函式的寫法實際上是Curry化的語法糖。即 func a b等價於(func a) b  point free style (也稱作 pointless style) 的函式,即通過柯里化 (Currying)省略掉單引數。例如:  中綴運算子可以加括號變為單引數函式。如 (*3) 5 的值為15。 但(-5)表示負值,所以單引數函式需要寫為(subtract 5)。  中綴運算子 $,可用於改變函式的呼叫次序,使其右邊的表示式先計算出來。這可以減少一對括號使用。例如 f (g (z x)) 與 f $ g $ z x 等價。其定義是: $ 還可以將資料作為函式使用。例如:  中綴運算子. 用於函式的複合,其定義是:

  提供了處理異常的函式///. import Prelude hiding(catch) import Control.Exception instance Exception Int instance Exception Double main = do 輸出結果  類似於 C++ using namespace std; int main() { 另外一個例子: do { } `catch` \ex -> do {  如果僅有一個錯誤條件, 類足夠用了,確省是Haskell的 class. 更復雜的出錯處理用 或 monads, 類似功能可用。

  

  如下是Haskell語言的"Hello world",注意其中除最後一行外皆可省略。 如下是階乘函式的Haskell實現:  它將階乘描述成有一個基本終止情形的遞迴函式。這跟數學定義中對階乘的描述很相似。事實上,Haskell中很多的程式碼的語法與功能都和數學一致。  上面的遞迴函式的第一行是可選的,它描述了這個函式的型態(types)。它可以讀作函式fac的型態為整數至整數(function fac has a int-to-int type)。這就是說,它以一個整型為引數,並且返回另一個整型。  第二行依賴的模式匹配,是Haskell程式中一個重要的部分。注意函式的引數是用空格分隔而不是在括號中。當函式的引數是0時,它會返回整型1。對於其他的情況則嘗試第三行。這是一個遞迴,它會一直執行只到滿足基本的情形。負引數會導致無限遞迴,一個guard保證第三行不會執行負引數。  "Prelude"是一個類似C中標準庫的小函式集合。使用Prelude,並用無指定引數的寫法,它可以改成:  上面的定義接近於數學中的定義:"f = g h"(參見複合函式),這並不是一個對變數賦值的語句。

  Haskell中可以定義高階函式(Higher-order Function),既將函式作為一個引數來使用,也可以將函式作為結果輸出,例如:  這裡f就是一個高階函式,它取一個從Int到Int的函式g作為引數,輸出一個從Int到Int的函式。高階函式的使用在一些情況下將極大的簡化程式碼。
Haskell()是一種標準化的,通用的純函數語言程式設計語言,有惰性求值和強靜態型別。它的命名源自美國邏輯學家哈斯凱爾·加里,他在數理邏輯方面上的工作使得函數語言程式設計語言有了廣泛的基礎。在Haskell中,“函式是第一類物件”。作為一門函式程式語言,主要控制結構是函式。Haskell語言是1990年在程式語言Miranda的基礎上標準化的,並且以λ演算為基礎發展而來。這也是為什麼Haskell語言以希臘字母「λ」(Lambda)作為自己的標誌。Haskell具有“證明即程式、命題為型別”的特徵。