パッケージティアリスト
ティアリストは、対戦型ゲームなどにおいてキャラクターなどの要素がどれほど環境を支配しているかを表す表である。ここでは、Haskellのパッケージのポピュラーさ、パフォーマンスや完成度などを総合的に評価し、S、A、B、C、D、Fの6つのティアに分類した。以下の要素が評価の対象となるが、主観も含まれており、完全な優位性を保証するものではない。
パフォーマンス(速度とメモリ使用量): プログラムの根幹をなすデータや制御構造などは気軽に変更できないためパフォーマンスに気をつけたい。
ドキュメントの網羅性
人気度
メンテナンスされているか
APIの一貫性: 筋道の通ったインターフェイスは筋道の通ったコードを促進する。逆の場合、雪だるま式にぼろが出がち。
依存パッケージのティア: いくら本体の完成度が高くても、質の低いライブラリを強いるようなAPIは減点対象。
S Tier
実用的なアプリケーションやライブラリを作る上で必須レベル。ライブラリのAPIはSランクのパッケージを中心に組みたい。
aeson JSONのデファクトスタンダード。ToJSON、FromJSONのインスタンスを定義しておくと何かと役に立つ。残念ながら時間・空間面のパフォーマンスはあまりよろしくない。
bytestring バイト列を扱うAPIではほぼ必須。
containers 言わずと知れたデータ構造のアソート。
directory ファイルやディレクトリを操作するライブラリ。
filepath ファイルのパスを操作するライブラリ。
mtl モナド変換子のためのクラスを提供する。もしライブラリがモナド変換子を定義するなら、連携を忘れないようにしたい。
network TCP/IPのためのパッケージ。半端な高水準APIは捨てた硬派なライブラリとなった。
stm Haskell(GHC)を並行処理に強い言語たらしめる強パッケージ。
text 文字列を扱うならtextで間違いない。
transformers モナド変換子を提供するライブラリ。
unordered-containers ハッシュベースのマップと集合。
vector 配列のデファクトスタンダード。非ボックス化やミュータブルなどのバリエーションが充実しており、機能が限定的な代わり暴力的な速さのストリーミングライブラリも付属している。
A Tier
多くのプロジェクトで使われており、仕事でも安心してピックできる。
async 手軽に非同期処理ができるコンビネータが揃っており文句なしの出来。
attoparsec 高パフォーマンスのパーサコンビネータ。APIは簡素だ。
cereal ▼ シリアライズ・デシリアライズライブラリ。binaryよりもだいぶ速度が改善されている。
cryptonite 暗号化や電子署名、ハッシュなどのアルゴリズムが一通り揃っており扱いやすい。
exceptions 例外処理ができるモナドのための型クラスたち。unliftioよりも適用範囲が広い。
http-client 2019年現在、HTTPクライアントのデファクトスタンダードと言える。
lens 言わずと知れたEdward Kmettの看板ライブラリ。レコードを多用する際の強い味方だ。
mwc-random 中速な疑似乱数生成器。暗号用途には推奨されない点に注意。
optparse-applicative オプションパーサに求められるものはほぼ全て入っておりカスタマイズ性が高い。optparse-simpleというラッパーもある。
QuickCheck 言わずと知れたQuickCheck。誰も文句を言わないだろう。
warp waiデファクトのWebサーバとそのインターフェイス。
prettyprinter 文字列をプリティプリント(整形)するライブラリ。乱立している整形ライブラリの中でもAPIの完成度が高く、ターミナルへの出力にも対応している。Showの改良版のような感じで使いたい。
random 乱数生成ライブラリ。1.2でAPIおよびアルゴリズムが刷新され、かつての汚名を返上した。
tasty-bench criterion・gauge互換の軽量なベンチマークライブラリ。
unliftio forkIOやcatchなど、並行処理や例外処理の関数の適用範囲をReaderTやそれに準ずるモナドに拡大する。ReaderTパターンを使うなら是非とも使いたい。
HUnit 単体テストのデファクトスタンダード。QuickCheckなどを併用する際は、テストフレームワークを活用したい。
tasty
B Tier
使用実績が少ないものもあるが、完成度が高く採用する価値はある。
Chart cairoやdiagramsなどを通じてグラフを描画するためのパッケージ。拡張性に富む。
conduit かつてはトップメタだったが、ストリーミングライブラリに依存しない方向に環境がシフトしたためここに落ち着いた。
criterion デファクトスタンダードのベンチマークキット。エクスポートや解析機能が充実しているガチンコ系。
gauge criterionから依存関係を削減した後発パッケージ。mean 41.65 ns ( +- 2.246 ns )のように一項目一行で表示できる--smallオプションが便利で、このためだけに使う価値がある。
foldl コンポーザブルなムーアマシンを提供するライブラリ。数値の列の平均値などを素早く求められる。
hmatrix linearよりもAPIに癖があるが、アルゴリズムが充実しておりパフォーマンスも良好。
JuicyPixels 画像の読み書きに関してほぼ唯一の選択肢。アルゴリズムは自前で用意する必要がある。
linear ベクトルや行列などの型と基本的な演算。正攻法な抽象化をしており使いやすい。
megaparsec parsecの上位互換と言っても差し支えない。機能もパフォーマンスも大幅に改善されている。
pipes conduitよりも実用面での機能は劣るが、リストモナド変換子を使いたいときに採用を検討したい(速度はdrinkeryが勝るが)
serialise ▲ CBOR形式でシリアライズする後発ライブラリ。binaryやcerealよりもパフォーマンスに優れるうえ、CBORが使われるプロトコルも増えてきたため今後の活躍が見込める。
splitmix 高速、純粋、分割可能、高品質の擬似乱数生成器。
trifecta 機能が充実したパーサコンビネータ。parsersという、Applicative本来の力を引き出すようなコンビネータライブラリに基づいており、お手本的な存在感がある。
websockets 得意分野であるとWebと並行処理を合わせると、自ずとWebSocketsも絡んでくるだろう。
witherable Functor、Traversableにフィルタ能力を付与したFilterable、Witherableを提供する。PureScriptやTypeScriptにも移植された。
yaml aesonのFromJSON・ToJSONのインスタンスをそのままYAMLにも利用できる。使いやすい。
C Tier
よく使われているがいくつかの問題を抱えていたり、ポテンシャルはあってもユーザーの獲得には至っていないものたち。GHCやHaskell Platformに同梱されているライブラリも多いが、不満な点も多いためここで挙げる。
array 一応標準の配列ライブラリだがほぼ空気。vectorと違い多次元配列に対応しているというメリットはある。
binary GHCに同梱されているシリアライズライブラリ。非常に遅い。
extensible 拡張可能レコードやエフェクトに関して最も機能が整っているが、そもそも必要な場面が少ない。
free Functorからモナドまたはコモナドを作れる。一時期は熱狂的な流行を見せたが落ち着いた(2012年Freeモナドブーム)。
HTTP ど直球なネーミングの、HTTPで通信するライブラリ。独自クラスによる抽象化が多いためあまりエレガントとは言えず、近年必須レベルと化しているHTTPSに対応していないのも痛い。
monad-control, lifted-base forkIOなどの関数をモナド変換子上で扱えるようにする。しかし抽象化が怪しく、予期しない動作を許してしまう(cf. monad-control is tricky)
OpenGL OpenGLのラッパーだが、その中途半端な抽象化が仇となり本来のAPIとの対応関係を理解するのが難しい。生のバインディングであるglパッケージのほうが使いやすく網羅性も高い。
parsec 老舗のパーサコンビネータ。baseと被る関数名の数々やパフォーマンスなどに難あり。
scalpel スクレイピング用ライブラリ。APIは扱いやすいがメモリリーク疑惑がある。
time 日付と時刻を扱う標準のライブラリ。IntegerやStringなどパフォーマンスに劣るデータ型がふんだんに使われている。
D Tier
これらを依存に加えるときは、白い目で見られることを覚悟したほうがいいかもしれない。
universum Maybeに対するFoldableメソッドを禁止するためだけにFoldableを作り直し、自らをエコシステムから切り離した謎のPrelude代替。
classy-prelude Prelude代替だが、あまりにも多くのシンボルをエクスポートしている。
list-t ListTの正しい実装で、もちろんtransformersのListTよりマシだが遅すぎて実用性を欠く。
extensible-effects 拡張可能作用を扱うライブラリ。本来売りだったはずの速度はextensibleの10倍遅いだけでなく、型推論に根本的な問題がありmtlの代替にはならない。
generic-deriving ジェネリクスによって数々の型クラスのインスタンスを導出するというコンセプトのライブラリだが、そのクラスが謎の再定義をされたものなのでbaseと互換性がなく、実用性も乏しい。あくまで教育目的のパッケージなので、実用する際はgeneric-dataを代わりに使おう。
F Tier
今これらを使う理由はほぼない。
iteratee ストリーミング黎明期を支えたパッケージだが、悪い意味で常識とかけ離れたAPIや、他のライブラリに比べて10倍遅いなど問題が多い。
hxt 老舗のArrowベースのXML操作ライブラリ。抽象化の仕方に強い癖があるだけでなく想像を絶するほどモジュール数が多く、習得が極めて困難。
definitive-base Prelude/base代替。CofunctorやContravariantのような用語を完全に勘違いして使っており、ただただ痛い。
合わせて読みたい
Haskell for all: How I evaluate Haskell packages
Haskell-jp wiki - Hikers Guide to Haskell
#ライブラリ