本書是關于ML程序設計的經典教材,詳細介紹如何使用ML語言進行程序設計,并講解函數式程序設計的基本原理。書中含有大量例子,涵蓋了排序、矩陣運算、多項式運算等方面。大型的例子包括一個一般性的自頂向下語法分析器、一個一演算歸約程序和一個定理證明機。書中也講述了關于數組、隊列、優(yōu)生隊列等高效的函數式實現,并且有一章專門討論函數式程序的形式論證。本書詳細講解如何使用ML語言進行程序設計,并介紹函數式程序設計的基本原理。書中特別講述了為ML的修訂版所設計的新標準庫的主要特性,并且給出大量例子,涵蓋排序、矩陣運算、多項式運算等方面。大型的例子包括一個一般性的自頂向下語法分析器、一個l-演算歸約程序和一個定理證明機。書中也講述了關于數組、隊列、優(yōu)先隊列等高效的函數式實現,并且有一章專門討論函數式程序的形式論證。本書可作為高等院校計算機專業(yè)相關課程的教材,也適合廣大程序設計人員參考。本書前言前言:本書源于對StandardML和函數式程序設計的講稿。它仍可以作為函數式程序設計的課本—一本面向實用,而不是標準的、理想化的書—然而,它主要是一本有效使用ML的指南。它甚至討論了ML的命令式特性。有些內容需要離散數學的知識,例如初等邏輯和集合論。讀者會發(fā)現以往的程序設計經驗是有用的,但不是必需的。本書是一本程序設計手冊,而不是參考手冊。它覆蓋了ML的主要方面,但并不盡述所有的細節(jié)。它在理論原理上花費了一些篇幅,但主要還是關心高效的算法和實際的程序設計。本書的組織反映了我的教學經驗。高階函數出現得較晚,在第5章講述。慣常的做法是在一開始就介紹一些不甚自然的例子,這樣做只能使學生們感到困惑。高階函數的概念是不容易理解的,需要充分的預備知識。所以,本書從基本類型、表和樹開始講述。當講到高階函數時,很多相關的例子已經是現成的了。練習的難度相差很大。它們不是用來評測學生的,而是為了提供實踐機會,拓展內容和激發(fā)討論的。本書一覽。大多數章節(jié)都專注于ML的各個方面。第1章介紹了函數式程序設計的背景思想,以及ML的歷史概況。第2~5章涵蓋了ML的函數式部分,包括對模塊的簡介。講述了基本類型、表、樹和高階函數。對函數式程序設計的更廣泛的原理也有所討論。第6章給出了論證函數式程序的形式方法??瓷先ニ坪跗x了程序設計的主題,然而錯誤的程序是沒用的。易于形式論證是函數式程序設計的一大好處。第7章詳細講述了模塊,包括函子(帶參數的模塊)。第8章講述了ML的命令式特性:引用、數組和輸入輸出。本書的其余部分由較大的例子構成。第9章給出了函數式的語法分析器和一個l-演算解釋器。第10章給出了一個定理證明機,這是ML的傳統(tǒng)應用。書中的例子非常豐富。其中一些只是為了說明ML的某個方面,但大多數本身就有一定用途—排序、函數式數組、優(yōu)先隊列、搜索算法、美化打印。請注意:雖然我測試過這些程序,但是它們仍不免含有錯誤。信息和警告塊。技術性的旁白、庫函數的敘述以及為進一步學習而給出的筆記都會不時地出現。它們被加以如下圖標以便有些讀者可以跳過:亨利王的要求。他們拿不出什么理由可以反對陛下向法蘭西提出王位的要求,只除了這一點,那個在法拉蒙時代制定的一條法律,InterramSalicammulieresnesuccedant,‘在撒利族的土地上婦女沒有繼承權’:而法國人就把這‘撒利族的土地’曲解為法蘭西的土地,并且把法拉蒙認做是這條法律的創(chuàng)制人和婦權的剝奪者??墒撬麄兊臍v史學家卻忠實地宣稱撒利區(qū)是在日耳曼的土地上……ML并不完美。某些缺陷會使簡單的編碼錯誤浪費掉程序員幾個小時的時間。而且,新的標準庫使得新舊編譯器不兼容。因此,本書中有一些這樣的警告圖標:小心葛羅斯特公爵。呵,勃金漢!小心那個狗東西:要知道,搖尾的狗會咬人;咬了人,它的牙毒還會叫你痛極而死;莫同他來往,千萬留意;罪惡、死亡和地獄都看中了他,地下的大小役吏都在供他使喚。我要趕緊補充一點,在ML里不會產生這么可怕的后果。程序里的錯誤是不能沖垮ML系統(tǒng)本身的。另一方面,程序員必須牢記,即使是正確的程序也可能給外部世界帶來傷害。如何得到StandardML編譯器。由于StandardML剛出現不久,很多學院沒有編譯器。下面列出了現有的一些StandardML編譯器,并附有聯系地址。書中的例子是在MoscowML、Poly/ML和StandardMLofNewJersey下開發(fā)的。我尚未嘗試其他的編譯器。要得到MLWorks,請聯系HarlequinLimited,BarringtonHall,Barrington,Cambridge,CB25RG,England。他們的電子郵件地址是web@harlequin.com。要得到MoscowML,請聯系PeterSestoft,MathematicalSection,RoyalVeterinaryandAgriculturalUniversity,Thorvaldsensvej40,DK-1871FrederiksbergC,Denmark?;驈幕ヂ摼W上得到該系統(tǒng):http://www.dina.kvl.dk/~sestoft/mosml.html要得到Poly/ML,請聯系AbstractHardwareLtd,1BrunelSciencePark,KingstonLane,Uxbridge,Middlesex,UB83PQ,England。他們的電子郵件地址是lambda@ahl.co.uk?;驈幕ヂ摼W上得到該系統(tǒng):http://www.polyml.org/要得到PoplogStandardML,請聯系IntegralSolutionsLtd,BerkHouse,BasingView,Basingstoke,HampshireRG214RG,England。他們的電子郵件地址是isl@isl.co.uk。要得到StandardMLofNewJersey,請聯系AndrewAppel,ComputerScienceDepartment,PrincetonUniversity,PrincetonNJ08544-2087,USA。更好的是可以從互聯網上得到文件:http://www.cs.princeton.edu/~appel/smlnj/http://www.smlnj.org/書中的程序和一些練習答案可以通過電子郵件得到,我的電子郵件地址是lcp@cl.cam.ac.uk。如果可能,請使用互聯網,我的主頁在http://www.cl.cam.ac.uk/users/lcp/致謝。編輯,DavidTranah,在寫作的各個階段提供了幫助,并建議了書名。GrahamBirtwistle、GlennBruns和DavidWolfram仔細閱讀了文本。DaveBerry、SimonFinn、MikeFourman、KentKarlsson、RobinMilner、RichardO誎eefe、KeithvanRijsbergen、NickRothwell、MadsTofte、DavidN.Turner和Harlequin的工作人員也對文本提出了意見。AndrewAppel、GavinBierman、PhilBrabbin、RichardBrooksby、GuyCousineau、LalGeorge、MikeGordon、MartinHansen、DarrellKindred、SilvioMeira、AndrewMorris、KhalidMughal、TobiasNipkow、KurtOlender、AllenStoughton、ReubenThomas、RayToal和HelenWilson發(fā)現了前幾次印刷中的錯誤。PieteBrooks、JohnCarroll和GrahamTitmus在計算機使用方面給予了幫助。我還要感謝DaveMatthews開發(fā)了Poly/ML,這是多年以來唯一高效的StandardML的編譯器。在眾多的參考文獻中,Abelson和Sussman(1985)、Bird和Wadler(1988)以及Burge(1975)的著作特別有幫助。Reade(1989)的書中包含了在ML中實現惰性表的有用思想。TheScienceandEngineeringResearchCouncil在過去20多年來給予了LCF和ML大量的研究資助。本書的大部分寫作工作都是我從劍橋大學休假的過程中完成的。我感謝計算機實驗室(ComputerLaboratory)和卡萊爾學院(ClareCollege)給予休假,以及愛丁堡大學對我六個月的招待。最后,我要感謝Sue,感謝她所給我的一切幫助,以及天天耐心傾聽我關于每一章進展的報道。