Haskell使我今仍為程序員狭魂。
十年前罚攀,我身為計算機科學(xué)家之信仰党觅,遭逢些許危機。環(huán)顧四望斋泄,方覺杯瞻,很大程度抖坪,我 甫煞,以數(shù)年前使用至今之相同工具之不同變種摔癣,解決相同問題碘赖。
某些程度上备徐,我遭遇瓶頸祥诽,或許不似專家級初心者(Erik Dietrick 所稱)般低級枫吧,然而最終察覺宴倍,即使我積極努力構(gòu)建一個由我可以從頭到尾編譯的正確代碼組成的大型代碼庫痹束,也只是發(fā)覺自己眼睜睜看著沙堡以遠(yuǎn)快于建造的速度崩塌检疫,甚至更糟,作為開發(fā)者我并無任何進步祷嘶。目之所及屎媳,并無銀彈。
面向?qū)ο缶幊讨荚谔峁┐a重用论巍。但借鑒 POSIWID (the Purpose Of a System Is What It Does)觀點來看烛谊,其旨在逼迫開發(fā)者放棄對改進生產(chǎn)力并平衡代碼重用與特定問題的精確的抽象層的企盼。
在此啟發(fā)下嘉汰,我決心返回并獲取學(xué)位晒来。沿這條路,于完成數(shù)學(xué)碩士學(xué)位后流離于語言學(xué)與生物信息之際郑现,我偶遇了 Haskell湃崩。
彼時,玩耍般寫著自己的編程語言已十五載之久接箫,其皆似 Perl攒读、Python、C++ 之子(因所知僅至此)辛友,摻雜些許不變性薄扁。發(fā)現(xiàn) Haskell 時,我察覺到废累,這門語言非但完成了所有我想嘗試去做的事情邓梅,甚至,它做得更好邑滨。
Haskell 社區(qū)總有比我更好的答案日缨。
此刻,我必須抉擇:或原路折返掖看,鴕鳥般埋頭于沙般裝作從未遇見Haskell匣距;或皈依 Haskell面哥,接納隱藏其后的思想。
此番信仰轉(zhuǎn)變余波綿延數(shù)月毅待。但尚卫,我從未回首。
其后尸红,我學(xué)習(xí)了范疇論吱涉,潛心研究函數(shù)式編程與類型理論。進階到可工作于 Coq 與 Agda 中后外里,我以自己獨特編程風(fēng)格下最具生產(chǎn)力的功重比返回 Haskell 層面休憩邑飒。
回到正軌后,我投身于做任何可以幫助 Haskell 社區(qū)繁榮興旺的事级乐,且終于我可以開始著手實現(xiàn)建立一個我可從頭到尾構(gòu)建的軟件庫的目標(biāo)疙咸。客觀上风科,我相信此時我比任何人維護的 Haskell 代碼都要多撒轮,僅僅靠寫 Haskell 代碼,我就登頂了 Github 最活躍用戶前五名贼穆。嗚呼题山,我隨波而溯,回到了青少年故痊,相較于單純地寫代碼顶瞳,更多地專注于社區(qū)的發(fā)展。
為何是 Haskell愕秫?
在嚴(yán)格求值語言中慨菱,最初推算算法的時間空間占用比較簡單,但如此膚淺的簡單必有代償戴甩。嚴(yán)格求值算法的組合常耗費時間計算你并不需要的東西符喝。
考慮這個經(jīng)典例子:
take 10 . sort
在嚴(yán)格求值語言中這將會排序整個序列,而我僅需查看其中前十個甜孤,但在非嚴(yán)格求值語言中协饲,比如 Haskell 帶有默認(rèn)惰性求值的數(shù)據(jù)結(jié)構(gòu),僅僅會排序出前十個元素缴川。若你的排序算法是”惰性快速排序“或是在 Haskell 實踐中使用的樹排序茉稠,你的算法會被提升至“快速選擇”,有更好的漸近線性能把夸。
你不必足夠聰明勤奮去融會貫通所有算法細(xì)節(jié)就可以獲得漸近線性能優(yōu)勢而线。嚴(yán)格求值語言會使你停頓注意性能并離題去修復(fù)性能問題終為速度犧牲代碼重用同時為代碼重用犧牲速度。我不愿為此般進退兩難之角所懸吊。
今吞获,大多情形使你可能已在嚴(yán)格求值設(shè)置下通過特定惰性值或副作用寫出惰性算法况凉,但實踐中人們不會這樣做谚鄙,因直白明確的惰性大規(guī)模使用太有害各拷。他們嘗試,他們挫敗闷营,之后他們停止烤黍。最好結(jié)果,你得到似生成器或流之類寫成的一些代碼傻盟。
其他 Haskell 優(yōu)勢不僅止于使惰性算法更好結(jié)合速蕊,而且純代碼允許平凡的并行或擴展。其使對單線程解決方案進行并行改進更簡單娘赴,鑒于其他語言中我懼于忘記妥善處理事件發(fā)生序(happens-before)語法或忽略限制之類规哲。
最后使我無法離開 Haskell 的因素是社區(qū)。(irc.freenode.net) 的haskell
頻道有1200余用戶诽表,且其為我在因特網(wǎng)中所見最一貫和藹聰明的一群人唉锌。
Edward Kmett 著于 2013年四月廿一日
轉(zhuǎn)載自Quara