學習Haskell的現實意義

2021-09-16 18:13:05 字數 2331 閱讀 5397

\u0026#xd;\njohn goerzen承認haskell要求重學大量基礎,並且認為對於具有命令式語言及物件導向程式設計背景的人來說,純潔性(purity)和惰性(laziness)是最大的觀念轉變。\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n他強調在haskell中,「任何有可能改變系統全域性狀態的事物都被嚴密隔離」,並「用型別系統標記出來」。這樣有助於大大減少實現錯誤,因為**中的不純元素都是靜態型別的,編譯時即可識別錯誤。這個特點將haskell與python等語言區別開來。純潔性也有利於測試,尤其當程式的結構是由許多小函式嵌合而成的時候;比如haskell的純潔性就有效地降低了通過quickcheck(譯註:haskell開源測試框架)進行測試的難度。\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n「惰性(laziness)是haskell的中心概念之一。當問到「惰性對現實世界的程式有何幫助?」 john goerzen著重說明了惰性在i/o中的應用:\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n如果我用haskell寫乙個小小的過濾器或者解析器,不需要怎麼操心按行或者按塊讀取輸入的事情,因為我可以直接用getcontents ,然後把函式乙個個串起來。我喜歡用haskell寫unix過濾器。\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n[……]有了輸入端的惰性,也就有了輸出端的惰性,因為列印輸出的時候不需要立即完成全部求解。[……]\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n最後你得到的是乙個設計非常簡明的程式,因為不用折騰輸入行的緩衝、迭代之類的事情,而且產生的程式只需要固定大小的記憶體。\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\njohn goerzen還談到haskell在表達能力上的優點,其優勢一是來自模式匹配,二是因為函式能把事物表達得既扼要又易讀,適合闡述問題之餘,又容易看清邏輯推導的步驟。訪談人更是認為可以「用函式和詞語建立一套詞彙,再用那套詞彙去作為書寫問題解答的語言」。 「用haskell擺弄函式確實就像用perl擺弄字串那麼簡單」,goerzen如是說。\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n然而,haskell語言的某些特性可能令來自oo或命令式語言的人們敬而遠之。比如它的遞迴方式就「可能有點嚇人」,因為類c語言所用的「變數遞增方式是一種代價非常低的操作」。不過,goerzen辯解說,儘管「高階語言一般達不到c的速度」,但ghc編譯器會將遞迴重寫成迭代,「非常高效地把你用遞迴表達的程式轉換成更適合於cpu執行的形式」。\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n有些人認為惰性就是「換來型別推導、純潔性這些東西,卻丟掉了對時間及空間複雜性的掌握」。john goerzen認為這個觀點要辯證地看:\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n我舉個例子,比如隨便用哪種語言寫一段程式[……],要求一次過讀入整個檔案,然後加以處理。開啟檔案、呼叫讀取操作、將整個檔案讀入記憶體,都是可以的。有些人會假設要處理的檔案只有100k,那麼這樣做當然沒問題。但如果你給他們乙個2g大小的檔案,這種做法就行不通了。\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n憑著他的經驗,john還批駁了關於haskell的io系統孱弱又難學的說法。他說,haskell裡嚇跑最多人的怪獸要數monad,但他要強調「無需撓破頭去理解什麼是monad、modad做些什麼,照樣可以寫出無懈可擊的haskell程式去處理io[之類的現實工作]」。比如使用io monad,不需要以理解monad為前提,粗淺地把monad當作「一種分隔純與不純**的盒子」就足夠了\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\n總而言之,john goerzen認為雖然「要把haskell裡的各種東西都叫上名字要費不少功夫」,不過之後會順暢許多,因為「看函式的型別就能把它們的所作所為知道得**不離十」。照他看,探索haskell是一樁賞心樂事,哪怕haskell不會成為萬眾矚目的明星,但「那麼別緻又有趣的語言,怎麼都值得學一學。」\u0026#xd;\n

\u0026#xd;\n

\u0026#xd;\ninfoq中文站補充訊息:《real world haskell》中文版正由albertlee翻譯之中,他在部落格上放出了一部分預覽章節。\u0026#xd;\n

\u0026#xd;\n檢視英文原文:

學習Haskell的現實意義

john goerzen承認haskell要求重學大量基礎,並且認為對於具有命令式語言及物件導向程式設計背景的人來說,純潔性 purity 和惰性 laziness 是最大的觀念轉變。他強調在haskell中,任何有可能改變系統全域性狀態的事物都被嚴密隔離 並 用型別系統標記出來 這樣有助於大大減少...

混沌的現實意義思考

大家先從數學公式開始研究,發現乙個穩定系統,其實是不可 的 後來發現,和實際情況一致.最簡單的乙個混沌現象為 三體運動 混沌的原理是 在乙個穩定系統中,比如三體,哪怕初始值差一點點 即使無限微小 根據公式帶入推導,推導一定次數之後,結果完全變化 因為我們觀察客觀世界不可避免的有誤差,所以客觀世界因為...

看《孔子》與現實意義

好久沒看電影,今天晚上翻到 孔子 的時候想起了周潤發說的話,想看看究竟能給我怎樣的感動。看完以後還之後還真是給我很多觸動,這些觸動並不是因為那些讓人感動的畫面,而是那種對理想和信念的堅持,在那個連溫保都尚未解決的年代,甚至連生命都無法得以保障的年代,有這樣一些人仍然堅守著自己的理想和信念,不願受外界...