天天看點

《Haskell函數式程式設計入門》——Haskell的由來

本節書摘來自異步社群《haskell函數式程式設計入門》一書中的第1章,第1.1節haskell的由來,作者 張淞,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

第1章haskell簡介

haskell函數式程式設計入門

本章首先介紹haskell相關的曆史,從lisp誕生到多種函數式程式設計語言百花齊放,再到haskell誕生的過程和現在發展的概況;接下來講解安裝haskell編譯器和編寫haskell程式所需要的軟體,以及調試與測試函數的工具ghci;然後介紹haskell中定義的兩種源代碼檔案(一個是以lhs為擴充名,另外一個是以hs為擴充名)有着怎樣的不同;最後編寫一個helloworld程式當做學習haskell旅程的第一步。

1.1 haskell的由來

要講述haskell的由來還要從函數式程式設計的誕生說起。函數式程式設計有着非常悠久的曆史,比c語言還要久遠。20世紀30年代,美國數學家alonzo church引入了λ演算(lambda calculus),這是一個通過使用符号表達變量的綁定和替換來定義函數計算的系統,它是函數式程式設計語言的重要基石。也就是說,早在電子計算機還沒有誕生的20世紀30年代,函數式程式設計語言就已經在孕育之中了。

1958年,斯坦福大學的教授john mccarthy受卡内基梅隆大學開發的一個名為ipl(information processing language)語言的影響,開發了一個名為lisp的函數式程式設計語言。雖然ipl并不是嚴格意義上的函數式程式設計語言,但是它已經有了一些基本思想,如清單内包、高階函數等,本書會在後面的章節中依次做介紹。這些特性深深地影響了lisp的設計。在lisp誕生之後,越來越多的人開始加入到函數式程式設計的陣營中來。同時,lisp的誕生也影響了很多程式設計語言的設計,時至今日,仍然有相當一部分人在使用lisp。

在20世紀60年代,牛津大學的peter landin和christopher strachey明确了λ演算對函數式程式設計具有極高的重要性,并于1966年開發出了一個名為iswim(if you see what i mean)的函數式程式設計語言,這是一個基于λ演算的純函數式程式設計語言,一定程度上奠定了函數式程式設計語言設計的基礎。

函數式程式設計發展到20世紀70年代早期的時候,愛丁堡大學的rod burstall和john darlington使用函數式程式設計語言通過模式比對來進行程式變換,并且明确地引入了清單内包的文法來更好地生成清單。幾乎在同一時期,david tuner教授在英國聖安德魯斯大學,又開發了一個名為sasl(st andrews static language)的純函數式程式設計語言,一定基礎上奠定了聖安德魯斯大學在函數式程式設計領域研究的地位。

1975年,麻省理工學院的gerry sussman與guy steele開發了scheme,這是一個更接近λ演算的語言,廣泛應用于實踐程式設計與教學中。如今,scheme仍然被很多高校作為首要的課程來講解。

不久,美國計算機科學家john backus緻力于函數式程式設計的研究,開發了一種名為fp的函數式程式設計語言。他引入了bnf符号系統以及對語言編譯器系統的開發做出了突出的貢獻,于1977年獲得了圖靈獎—他著名的圖靈獎報告《程式設計是否能從馮諾依曼的體系風格中解放出來》(can programming be liberated from the von neumann style ?)1中提到的“解放”的方式,實際上指的就是函數式程式設計。

也幾乎是在同一時期,劍橋大學的robin milner開發了ml(meta-language),并發展出了多态類型系統——hm-system(hindley-milner type system),其中包括類型推斷以及類型安全與異常處理機制。這個語言中的多态類型系統對函數式程式設計的發展意義重大,值得一說的是,haskell使用的正是這種類型系統。

scheme與ml都具有一定的順序式語言的特性,但是這些語言改善了函數式程式設計的風格并且明确地引入了高階函數的概念。20世紀70年代末與80年代初,惰性求值這一概念被重新被發展。sasl在1976年加入了惰性求值的功能,也出現了lazy ml,即ml的惰性版本。在程式的運作過程中,惰性求值可使計算機僅僅計算需要的資料。

在近幾十年的時間裡,各個大學的學者們通過對函數式程式設計的研究,湧現出了很多基于函數式程式設計的理論。當然,與此同時還出現了很多不同的函數式程式設計語言。1987年,在美國俄勒岡州舉行的函數式程式設計與計算機結構的會議(functional programming and computer architecture conference,fpca)上,與會者們就當時函數式程式設計語言種類過多、文法相似且大多數效率不高的現狀進行了讨論。他們認為,這樣下去的結果将會是越來越多的人研究和使用函數式程式設計語言,但是人們所使用的語言卻得不到很好的統一。這種情形不利于函數式程式設計的研究、應用與發展。于是會議決定設計一個開源、免費、文法簡單、運作穩定、效率高,可适用于函數式程式設計教學、研究,并且可編寫應用軟體的純函數式程式設計語言來緩解函數式程式設計語言過多的混亂的局面,它的名字就是haskell。它的命名源于美國數學家haskell brooks curry,為紀念他在λ演算與組合邏輯(combinatory logic)方面作出的突出貢獻。haskell curry使得函數式程式設計語言的設計在理論上有了非常堅實的基礎。由此可見,haskell是函數式程式設計發展了近60年的結晶,彙集了其他函數式程式設計語言的精華于一身,經過了20餘年的發展,如今還在不斷地壯大。

haskell僅僅意為一門計算機程式設計語言,語言标準的1.0版本于1990年釋出,文法的主要設計者之一是現任職于微軟劍橋研究院的simon peyton jones2教授。haskell這門語言的編譯器有很多種,其中ghc(glasgow haskell compiler)是最常用的haskell語言的編譯器,名為哥拉斯哥是因為該編譯器最初是基于kevin hammond教授在英國哥拉斯哥大學于1989年用lazy ml所編寫的原型。一年後,在simon peyton jones的帶領下,這個原型除分析器(parser)的部分全部被重寫。第一個ghc的測試版于1991年4月1日釋出,同時ghc也被作為了英國學術研究項目之一并且開始接受英國政府的資金支援。除ghc外,haskell還有很多其他的編譯器,比如由荷蘭烏特勒克大學編寫的uhc(utrecht haskell compiler),由john meacham所編寫的jhc等。随着發展,haskell語言的标準也開始發生變化,越來越多的特性與功能被逐漸加進來,兩個裡程碑的版本分别是haskell 98和haskell 2010。本書的大部分代碼是符合haskell 98标準的,但有一部分用到了haskell 2010中增加的内容。讀者可以參閱haskell 98 report3和haskell 2010 report4來了解haskell文法标準。