Haskell進入生產(Hasura.io)

banq發表於2015-02-16
Hasura.io使用haskell作為核心程式語言建立微服務平臺,並分享了一些實踐經驗,如預設同步非同步使用GHC等。

詳見:From Zero to HIPster (Haskell In Production)

該開發團隊背景是:大部分開發人員具有主流語言C, Java, Python, C++, C#, Javascript等開發經驗,他們著手建立一個PaaS/Baas,起初他們評估了各種語言看看是否適合構建核心平臺。

雖然Haskell的純函式語言,健壯 內建高併發和並行語言非常吸引人,但是陡峭的學習曲線也是風險,還有範疇理論導致其更加神秘。

他們對幾種語言進行了比較,從程式設計難易與意願 記憶體消耗和併發幾個指標衡量:
1.Java: 程式設計難易與意願是None,記憶體消耗高,併發成熟。
2.Node.js: 程式設計難易與意願是ok,但是回撥函式巢狀迴圈,記憶體消耗一般,併發相當成熟。
3.Hashell: 程式設計難易與意願是yes,預設是同步程式設計,使用GHC處理非同步,記憶體消耗低,併發成熟。
4.Python: 程式設計難易與意願是yes,記憶體消耗高,併發不容易。

起初他們進行了一些評估程式設計,使用Haskell編寫一些微服務,包括ZeroMQ的broker,自動生成型別安全的CRUD和查詢資料庫表的API,一個redis快取層。

真實一個案例:開發一個Http伺服器,JSON分析和Postgres資料庫介面。

經過幾種語言挑選,選中了Haskell,實現案例需要Haskell相應框架庫包:

1.Warp是http伺服器
2.Aeson是JSON分析框架
3.Hasql是Postgres 連線驅動庫包

經過這個案例專案以後,他們總結Haskell優點如下:
1. 純函式:能夠讓整個程式變得可推理,有條理,程式碼直接精確反映了我們的(邏輯)推理。
2.精確程式碼:立即寫程式碼,馬上就能重構,更少的程式碼讓你重構更容易。
3.健壯程式碼:靜態語言 型別推斷和智慧的編譯器。
4.測試:型別系統大大降低了大型類的單元測試,快速檢查是另外一類測試風格,能透過自動生成你的函式的斷言測試用例;當然手動測試還是最重要,包括IO相關故障。
5.IO高併發:GHC的執行緒抽象和IO管理器,易於從併發執行計算角度考慮,並能得到基於事件的非同步執行框架如Node.js的所有優點。其次,GHC有一個類似Node.js的非堵塞IO,支援實時多執行緒和自然地多核(Node.js需要cluster庫包支援多核),可以像Node那樣使用事件程式設計,這真的不是一場公平競爭。
6.豐富庫包:Haskell庫包非常易於整合。
7.部署:私有云部署Haskell非常容易,因為所有依賴的庫包都是靜態連結,能夠一步到位進行版本控制和部署。

一些問題:
1Type error型別錯誤讓初學者感覺奇怪,分析語法錯誤根本沒有用。
2.文件:簡單時型別就是文件,但是一些庫包,型別簽名沒有提供文件,這種情況下使用這些庫包需要努力一點。
3.語言擴充:當你在haskell中尋找庫包時,你會看到GHC的語言擴充,有些很直觀((OverloadedStrings, ScopedTypeVariables)),有些不是 (RankNTypes),難於從原始碼中進行學習。


[該貼被banq於2015-02-16 10:40修改過]

相關文章