今日數學家 |
![]() |
Haskell Brooks Curry (September 12, 1900, Millis, Massachusetts – September 1, 1982, State College, Pennsylvania) |
當年今日數學家 | |||||||||||||
|
只不過是另一個Haskell教學
作者:Hal Daume III
試譯者:jiing
作者版權宣言
這個教程的印前(preprint)版本打算讓整個 Haskell 社群可用,所以我們給每個人都授予拷貝和發佈的權利,前提是它被完整地重製,包括此聲明在內。
修改的版本未經作者同意均不能散佈,且必須維持本聲明的複本。作者保留隨時修改本書版權和不再長期免費提供本書的權利。
關於此報告
Yet
Another Haskell Tutorial
的目標是去提供對Haskell程式語言完整的介紹。它假設你沒有Haskell程式語言的知識也不熟悉一般的函式化編程(functional
programming)。然而,一般程度的熟悉編程的概念(例如演算法)會有幫助。這並不想去成為一般介紹程式語言的書;而是,用Haskell寫程
式。足夠熟悉你的作業系統和文字編輯器也是必需的(此報告且討論Windows
和*Nix系統上的安裝和組態設定;其它的作業系統可能會支援—查閱你所選擇的編譯器的文件以獲得更多在其它平台上的安裝方式。)
什麼是Haskell?
Haskell
被稱作一個懶惰的,純函式化程式語言。它被稱作懶惰是因為」對於一個沒有被評估的問題不需要去決定其答案」的表示式。相對於懶惰是嚴格,這是大部份共通程
式語言(C, C++,
Java,甚至是ML)的策略。一個嚴格的語言其每個表示式都被估算,無論其運算結果並重要與否。(對嚴格語言做最佳化的編譯器而言,這可能不完全對,
因為它們通常會做「死碼消除(dead code
elimination)」—這會從程式移除未用到的運算式,)它叫做純化(pure),因為它不允許邊際效應(side
effect)(邊際效應是某種會影響到世界的」狀態(state)」。例如,一個印出某些東西到螢幕上的函式被說有邊際效應,因為它是一個影響到全域變
數值的函式。)當然,沒有邊際效應的程式語言可能會超級沒有用(horribly
useless);Haskell使用一個monads的系統來從程式剩餘的部份隔離所有不純淨的運算,並且用安全的方式來執行它們(monads適當性
的討論請見第九章或是第五章的如何在一個純語言內做輸入/輸出)。
Haskell被稱作函式化(functional)語言, 因為程式的估算等價於估算一個在純數學意味的函式。這也不同於標準的,估算一串敍述(statement)的語言(如C和Java),一行在另一行之後(這被稱作命令式(imperative)語言)。
Haskell的歷史
用作者群的話是描述Haskell的歷史最好的方式。下列的文字是引用已表的Haskell 98報告:
在1987
年的九月,在波特蘭,奧勒崗(Portland, Oregon)舉辦了一場Functional Programming
Language和Computer
Architecture(FPGA'87)的研討會(conference),來討論一個函式化編程社群中運氣不好(unfortunate)的情況:
已經變成有超過一打不嚴格的,
純函式化編程語言,全都在表現力和語意支柱(underpinning)上很相似。在此會議上有強大的輿論說要更廣泛的使用此類型的函式化語言被缺乏一個
共同的語言所妨礙了。於是決定說一個委員會應該被形成來設計這樣的一個語言,提供較快速的新點子的溝通,一個對於實際應用程式發展的穩定基礎,和一個經過
其它人會被鼓勵來使用函式型語言的手段(vehicle)。此文件描述委員會努力的結果:一個叫作Haskell的純函數化程式語言,在邏輯學家
Haskell B。 Curry之後被命名,Haskell B。 Curry的工作成果為我們提供了很多邏輯的基礎。
委員會主要的目標是去設計一個滿足這些限制的語言:
2. 它應該能經由公開正式語法和語意(formal syntax and semantics)被完整地描述。
3. 它應該是免費可用的。任何人應該被允許實作此語言並且散佈它給他們喜歡的人。
4. 它應該基於欣賞廣大輿論的想法。
5. 它應該減少在函式化程式語言中不需要的多樣性(diversity)。
委
員會想要讓Haskell能擔任未來在語言設計研究上的基礎,且希望語言的擴充或變化會出現,能整合實驗性的特色。Haskell自從它初次公開以來,的
確已經持續地演化。在1997年中,已經有四次反覆的語言設計(最後的那次是Haskell
1.4)。在1997年阿姆斯特丹(Amsterdam)的Haskell
Workshop,決定說Haskell需要有穩定的變異,此穩定的語言是那個報告的主題,且被稱作Haskell 98。 Haskell
98被認為是對Haskell 1.4的相當小範圍的整理(tidy-up),做了一些簡化和移除一些可能疏忽的陷阱。
它企圖成為一個穩定的語言,以實作者被承認是完全支援Haskell 98規格,為了可預見的未來。
原
本的Haskell Report只涵蓋語言,伴隨標準函式庫的稱作是Prelude(前奏曲)。在大約是Haskell
98被穩固化的時候,它變得明白了,許多需要存取較大的函式庫函式集合的程式(特別地考慮輸入/輸出和簡單的與作業系統的互動)。如果這些程式想要是可移
殖的(portable),一個函式庫集合也必須被標準化。因此由不同的委員會(不過可能會重疊)開始個別努力去修改Haskell 98函式庫。
為何使用Haskell?
因
為你正在閱讀此教程,很明顯地你正對Haskell感興趣。有很多的動機來使用Haskell。我個人使用Haskell的理由是:我已經發現使用
Haskell與其它的語言比起來,我在更短的時間內寫更多無誤(bug-free)的程式碼。我也發現它非常具可讀性和延伸性。
然而,或許更重要的是我已經發現Haskell社群是難以置信地有幫助。語言持續地演化(那並不是說它不穩定,而是有許多擴充(extensions)已經被加到某些我覺得非常有用的編譯器)當新的擴充(extensions)被實作時,使用者的建議通常會被注意到。
為何不用Haskell?
我的最大的二個抱怨和大部份我認識的Haskellers的委屈是:(1)產生的程式碼有比用像C的語言寫的相同的程式來得慢的傾向;(2)它有點難以除錯。
第
二個問題似乎不是非常大的問題:大部份這些我已經寫的程式碼並不會很多瑕疵(buggy),而在其它語言中大部份瑕疵的共同來源是不存在於
Haskell內的。第一個問題以我的經驗已經出現好幾次了;然而,在數天編程和除錯的時間之後,如果我必須為我的結果等待稍微久一些,CPU時間幾乎總
是比程式設計師的時間便宜,。
當然囉,這並不是所有應用程式的情況。一些人可能發現使用Haskell花費的速度是不可忍受的。然而,
Haskell有一個標準的外部函式介面(foreign-function
interface),當你需要從你的程式碼獲得最大速度時,它讓你連結以其它語言寫成的程式碼。如果你覺得這不夠,我會建議看一下O'Caml語言,它
常常有比C++更傑出的表現,且也有很多Haskell的優點。
目標觀眾群
已經有許多關於Haskell的書和教程了;(幾近)完整的清單,請見在Haskell首頁的http://haskell.org/bookshelf (Haskell 書架)。這些教材的簡短報告產生了:
A Gentle Introduction to Haskell是一個Haskell的簡介,前提是讀者已經熟悉函式化編程很久了(en large)。
* Online Haskell Course是一個對Haskell初學者的簡短課程(以德文寫的)。
* Two Dozen Short Lessons in Haskell是一本強調使用者要進入情況的傑出教科書的草稿。
* Haskell Tutorial是根據一個給予第三國際暑期學校的進階函式化編程的課程而撰寫的。
* Haskell for Miranda Programmers假設讀者已有Miranda語言的知識。
* PLEAC-Haskell是一個Perl Cookbook風格的教程。
雖
然這些教程全都很優秀,它們本身都不完整:Gentle
Introduction對初學乍練的Haskeller而言有點太高階了,而其它的則太早結束了,或是沒有涵蓋每一件事。Haskell對新的程式員和
有經驗的非函式化編程員而言都充滿了陷阱,藉由讀完Haskell的郵件論壇(mailing list)你可以得到印證。
有強烈的需要一個介紹
性的、不假設讀者有函式化編程知識的教程的想法漸漸變得清楚,教程是進階的意思是它確實假設讀者有一些編程的背景。更進一步地說,已知的教程中介紹輸入/
輸出和迭代(iterativeity)沒有夠快的。(到248頁前都沒有,如同Hudak
book的情況。)此教程不是給初學的程式員的;假設已有一些編程和電腦的經驗和知識(雖然附錄確實包含一些背景資訊。)
Haskell語言經歷了標準化的過程,而結果被稱為Haskell 98。本書的大部份會涵蓋Haskell 98。任何從標準的變異會被註釋(例如,許多編譯器提供特定的對標準的有用的擴充;這些中的一部份會被討論。)此教程的目標是:
* 提供綜合的、對Haskell語言的隨意的介紹
* 指出常見的陷阱和它們的解決方式
* 提供Haskell如何被使用於現實世界的好見解。
致謝
最後,我想要特別感謝 Simon Peyton Jones,Simon Marlow,John Hughes,Alastair Reid,Koen Classen,Manuel Chakravarty,Sigbjorn Finne和Sven Panne,他們的支持都讓我學習Haskell的生活更快樂。肯定有其它幫助過我但沒有被列出的,而這些是我記在心裡的。
Hal Daum'e III
