Haskell 有哪些威力十足的庫?
作為一個編程語言,大規模上手還是挺看framework的,比如ruby之於ror,python至於django scipy numpy等,零散的學Haskell有一陣子了。請問Haskell有哪些能發揮Haskell優美語法優勢的庫呢?
post-rfc/sotu.md at master · Gabriel439/post-rfc · GitHub
選摘/擴充其中我熟悉的一些經典庫,均可通過Hackage安裝,少數ghc自帶:
Testing
QuickCheck: Automatic testing of Haskell programs - 指定函數性質,啟發式生成測例進行測試smallcheck: A property-based testing library - 與QuickCheck類似,枚舉小測例測試
Compiling Related
parsec: Monadic parser combinators - 經典的parsing組合子庫,支持帶狀態的parsing,可作為monad transformer使用attoparsec: Fast combinator parsing for bytestrings and text - 對bytestring使用的高性能parsing組合子庫hoopl: A library to support dataflow analysis and optimization - 語言無關的控制流優化庫Data Parallel Programming
repa :: Stackage Server - 支持多核計算的數組庫,開啟ghc的threaded runtime和多核選項,即可利用Haskell的threading API進行並行計算,計算過程可以調用任意Haskell函數accelerate :: Stackage Server - 異構計算支持庫,使用accelerate-cuda後端可以用顯卡進行並行計算。accelerate使用一套DSL定義計算,計算過程不能調用任意Haskell函數Task Parallel Programming
parallel: Parallel programming library - 利用惰性求值特性進行並行計算的Eval monadmonad-par: A library for parallel programming based on a monad - 具有動態的調度器,可以實現編譯期不確定求值順序的dataflow parallel programming的Par monad。和Eval monad一樣,底層用到了ghc編譯器的sparks介面(不是那個Spark!)
Concurrent Programming
stm: Software Transactional Memory - 高質量的STM實現async: Run IO operations asynchronously and wait for their results - 高質量的Future庫,其中的Concurrently的Applicative instance就是簡單版本的「There is no fork」,你有一系列IO action需要並發執行並收集結果,只要用Concurrently的&<*&>運算符,連手動新建Async都省了,非常漂亮async-pool: A modified version of async that supports worker groups and many-to-many task dependencies - async庫的加強版,支持建立資源池來限制和管理Async的執行Resource Management
resourcet :: Stackage Server - ResourceT,一個異常安全的獲取和釋放資源的monad transformerIteratee IO
conduit: Streaming data processing library. - O(1)內存處理數據流,同時可以配合ResourceT保證資源的及時釋放。克服了lazy IO方法容易造成資源泄露的問題。常見的衍生庫有http-conduit,cereal-conduit,crypto-conduit,process-conduit,attoparsec-conduit,等等Database
acid-state: Add ACID guarantees to any serializable Haskell data structure. - Database for free,只要加幾句Template Haskell聲明,就可以給你的數據類型加上序列化/反序列化功能,並可以像資料庫一樣在磁碟上持久化,有ACID保證,可多線程使用。不適合處理大量數據,但是狀態數據量少、需要中斷/恢復功能的程序,用acid-state可極大簡化實現
TCache: A Transactional cache with user-defined persistence - 與acid-state類似。不同之處在於,acid-state是單變數的資料庫,而TCache是多變數的;可以配合stm使用;配合persistent,有多個持久化後端,除了自有格式以外,還有SQL資料庫/MongoDB之類的NoSQL資料庫/AWS之類的雲服務等後端Vector Graphics
diagrams: Embedded domain-specific language for declarative vector graphics - 實現了一套DSL描述矢量圖,可以寥寥幾句描述出漂亮的圖案,並用多個後端編譯到多個格式(最常用的是SVG)Document Conversion
pandoc: Conversion between markup formats - 大名鼎鼎的格式轉換工具,不用多介紹了吧。另外pandoc的Markdown格式是我認為的所有Markdown擴展里最好的一個Lens
lens: Lenses, Folds and Traversals - van Laarhoven lens的實現。lens是一個能夠聚焦到複雜數據類型內部的數據結構,使用得當,可以大量減少boilerplate codeLanguage Related
idris: Functional Programming Language with Dependent Types - Idris語言編譯器。Idris借鑒Haskell,設計目標為General purpose dependently typed language,與Coq/Agda等定理證明工具相比,希望借用依賴類型作為實用的通用語言。語言裡面有很多有意思的構造,first-class type、value class等等,感興趣可以找Edwin Brady的論文看template-haskell: Support library for Template Haskell - ghc內Template Haskell的API。通過Template Haskell,可以用程序生成AST,同時不失去類型安全,也不用擔心意外capture某個identifier這種缺乏衛生宏/gensym等機制下的宏系統的常見問題
liquidhaskell: Liquid Types for Haskell - 進一步擴展Haskell的類型系統,加入了Refinement Type支持9.3.Compiler Plugins - ghc內部API提供了寫編譯器擴展的介面,可以在不Hack編譯器主體的情況下,將plugin實現為一個普通的庫,然後魔改編譯過程,通常用於實現一些特殊的優化今天先舉這麼多。還有其他很多強悍的東西,包括FRP,以及用於嵌入式硬體的DSL等,我懂得少這裡就不列了;另外一些方面,比如Web Server/Client庫等等,與其他語言同類庫相比Haskell有成熟實現但並非出類拔萃,所以我也沒有列。這裡收藏的是我覺得自己以後可能用上的, 不求完整但求簡約實用
有些跟樓上重複到, 但為了完整性, 有些就再重複一次自動化建構工具 make 的 Haskell 版本, 可以用 Haskell 寫 make 本身就是賣點 shake: Build system library, like Make, but more accurate dependencies.證明 Haskell 程序正確性的證明器 不只是理論上的數學定理, 甚至能夠證明某程序的浮點數會不會overflow, 讓一般常用的軟體測試顯得不嚴謹基於擴展型別系統 ucsd-progsys/liquidhaskell · GitHub
基於程序表達式跟smt演算法 SBV by LeventErkok數字電路設計賣點是能把高階函數跟型別系統應用在硬體語言 kansas-lava: Kansas Lava is a hardware simulator and VHDL generator.CλaSH - From Haskell to Hardware嵌入式程序設計NASA用來控制無人飛行器, 也可以用來寫arduino板子, 且包含SBV後端用來證明程序正確性, 但語法有點彆扭, 且型別支持不如前面兩個硬體數字電路語言copilot: A stream DSL for writing embedded C programs.分散式邏輯編程Prolog從來沒實作在計算機集群上, 但Haskell有實作, 不知道實用價值但本身就很強大
LogicGrowsOnTrees: a parallel implementation of logic programming using distributed tree exploration統計相關 簡約實用的貝葉斯統計庫 adscib/monad-bayes · GitHub 這個不算是統計, 算是機率題目的解題器, 由 spec 精確算出機率值 probability: Probabilistic Functional Programming 嵌進帶型別的R語言 HaskellR - Programming R in HaskellHaskell 執行時期跑 Haskell 執行時期載入動態函式庫 plugins: Dynamic linking for Haskell and C objects Haskell解釋器的Monad, 因為直接用 GHC API 實在很複雜 hint: Runtime Haskell interpreter (GHC API wrapper)FRP 編程用戶交互及響應等事件撿一個老牌又有眾多實例的 reactive-banana: Library for functional reactive programming (FRP).
有些無聊的範例遊戲可以玩Web 相關 Haskell to javascript: Haste 兼容不少既有的hackage函式庫, 雖沒有ghcjs來得兼容, 但ghcjs產生的js實在太大號達MB, Haste產生的js很輕量, 比較有實用價值 Type-safe, Functional Web Development 後端很多種framework, 這個貌似比較好懂 agrafix/Spock · GitHub今天新發現一個:HaskellR - Programming R in HaskellProgramming R at native speed using HaskellReddit討論貼:HaskellR - Programming R in Haskell : haskellPaper:https://ifl2014.github.io/submissions/ifl2014_submission_16.pdfLicense: BSD3
簡單介紹:
An R-to-Haskell interoperability solution (invoking R functions on Haskell data and vice
versa) making it possible to program all of R, including all library packages
on CRAN, from Haskell, a general-purpose, statically typed,
compiled language
對我個人而言,挺有誘惑力的,之前許多繪圖和統計代碼大都使用StringTemple的方式嵌入在Haskell里,現在有type safe的方案了,使用上也簡單很多,效率也比system調用R解釋器高許多。之前用R寫代碼總有股說不出的噁心感,終於不用這麼抵制了:)
目前Haskell本身的統計相關庫非常稀缺,這個庫可以直接在R與Haskell之間交互,Haskell在統計分析上一大塊短板被填平了。。。語言已經很難形容我內心的激動了!!其他答案都說了些流行的, 我挑些冷門點的說.GHC/As a library yeah, GHC可以當作庫來用jaspervdj/digestive-functors · GitHub 使用Applicative來做Validation的Form抽象Formlet的後繼bos/configurator · GitHub 動態載入, 配置管理bitemyapp/bloodhound · GitHub 我是看這庫的類型才學會怎麼寫Elasticsearch的查詢knupfer/haskell-emacs · GitHub 用Haskell寫Emacs拓展
SBV by LeventErkok SMT Solver
harpy: Runtime code generation for x86 machine codefacebook/Haxl · GitHub 最後一個用來嚇唬你們不定期更新--Software Testing
- Quickcheck :被很多語言移植
- HLint:Lint系列。。
Compiler Infastructure
- Parsec :被很多語言移植
- Happy
- Hburg
- ...
GPU Programming
- Repa
Stream Programming Model
- Pipes
Web Framework
- yesod
- snap
...
居然沒有人提到ekmett的lens
簡單舉例:將列表中所有偶數編號元素+1[1,2,3,4,5] traversed . indices even %~ (+ 1)
我說一個實用的吧,可能一點也不高大上,但是當你真正起步用haskell的時候知道這個庫可以簡化很多操作
MissingH 是一個工具方法庫,提供了很多使用的方法。MissingH: Large utility library比如對於list,提供了split(我自己專門寫過一個方法把csv轉為[[Char]],有split就只需要直接調用了)
比如對either,提供了forceEither,如果結果是Right可以直接使用,如果結果是left則異常
比如對Path,提供了slice_path,unslice_path等,可以把path逐層拆為list,或者組裝起來
每一個函數都不神奇,但是勝在數量多範圍廣,而且奇怪的是很少有教程提到。
所以考慮到題主初學,提出來讓題主了解一下cpython: Bindings for libpythonerlang: FFI interface to Erlang.java-bridge: Bindings to the JNI and a high level interface generator.inline-java: Java interop via inline Java code in Haskell modules.inline-c: Write Haskell source files including C code inline. No FFI required.inline-c-cpp: Lets you embed C++ code into Haskell.inline-r: Seamlessly call R from Haskell and vice versa. No FFI required.language-c-inline: Inline C Objective-C code in Haskell for language interoperabilityhslua: A Lua language interpreter embedding in HaskellHsPerl5: Haskell interface to embedded Perl 5 interpreterhruby: Embed a Ruby intepreter in your Haskell program !
Parsec. 比lexyacc好用多了
Awesome Haskell當然我並沒有全看,但是掃了幾個感覺品位還是可以的,自取https://github.com/krispo/awesome-haskell
24 Days of Hackage 201224 Days of Hackage 2013
STM,請參考 &
推薦閱讀:
※有沒有比較實用、成熟的 Haskell 應用?
※使用 Cabal hook 構建複雜 Haskell 項目
※GHC擴展-XRankNTypes是什麼?如何理解forall .?
※Kotlin到Dart的簡單翻譯器的坑基本上填完了