パッケージティアリスト
ティアリストは、対戦型ゲームなどにおいてキャラクターなどの要素がどれほど環境を支配しているかを表す表である。ここでは、Haskellのパッケージのポピュラーさ、パフォーマンスや完成度などを総合的に評価し、S、A、B、C、D、Fの6つのティアに分類した。以下の要素が評価の対象となるが、主観も含まれており、完全な優位性を保証するものではない。
パフォーマンス(速度とメモリ使用量): プログラムの根幹をなすデータや制御構造などは気軽に変更できないためパフォーマンスに気をつけたい。
ドキュメントの網羅性
人気度
メンテナンスされているか
APIの一貫性: 筋道の通ったインターフェイスは筋道の通ったコードを促進する。逆の場合、雪だるま式にぼろが出がち。
依存パッケージのティア: いくら本体の完成度が高くても、質の低いライブラリを強いるようなAPIは減点対象。
S Tier
実用的なアプリケーションやライブラリを作る上で必須レベル。ライブラリのAPIはSランクのパッケージを中心に組みたい。
aeson JSONのデファクトスタンダード。ToJSON、FromJSONのインスタンスを定義しておくと何かと役に立つ。残念ながら時間・空間面のパフォーマンスはあまりよろしくない。 mtl モナド変換子のためのクラスを提供する。もしライブラリがモナド変換子を定義するなら、連携を忘れないようにしたい。 network TCP/IPのためのパッケージ。半端な高水準APIは捨てた硬派なライブラリとなった。 stm Haskell(GHC)を並行処理に強い言語たらしめる強パッケージ。 vector 配列のデファクトスタンダード。非ボックス化やミュータブルなどのバリエーションが充実しており、機能が限定的な代わり暴力的な速さのストリーミングライブラリも付属している。 A Tier
多くのプロジェクトで使われており、仕事でも安心してピックできる。
async 手軽に非同期処理ができるコンビネータが揃っており文句なしの出来。 exceptions 例外処理ができるモナドのための型クラスたち。unliftioよりも適用範囲が広い。 random 乱数生成ライブラリ。1.2でAPIおよびアルゴリズムが刷新され、かつての汚名を返上した。 unliftio forkIOやcatchなど、並行処理や例外処理の関数の適用範囲をReaderTやそれに準ずるモナドに拡大する。ReaderTパターンを使うなら是非とも使いたい。 B Tier
使用実績が少ないものもあるが、完成度が高く採用する価値はある。
Chart cairoやdiagramsなどを通じてグラフを描画するためのパッケージ。拡張性に富む。 gauge criterionから依存関係を削減した後発パッケージ。mean 41.65 ns ( +- 2.246 ns )のように一項目一行で表示できる--smallオプションが便利で、このためだけに使う価値がある。 hmatrix linearよりもAPIに癖があるが、アルゴリズムが充実しておりパフォーマンスも良好。 linear ベクトルや行列などの型と基本的な演算。正攻法な抽象化をしており使いやすい。 megaparsec parsecの上位互換と言っても差し支えない。機能もパフォーマンスも大幅に改善されている。 serialise ▲ CBOR形式でシリアライズする後発ライブラリ。binaryやcerealよりもパフォーマンスに優れるうえ、CBORが使われるプロトコルも増えてきたため今後の活躍が見込める。 witherable Functor、Traversableにフィルタ能力を付与したFilterable、Witherableを提供する。PureScriptやTypeScriptにも移植された。 yaml aesonのFromJSON・ToJSONのインスタンスをそのままYAMLにも利用できる。使いやすい。 C Tier
よく使われているがいくつかの問題を抱えていたり、ポテンシャルはあってもユーザーの獲得には至っていないものたち。GHCやHaskell Platformに同梱されているライブラリも多いが、不満な点も多いためここで挙げる。
array 一応標準の配列ライブラリだがほぼ空気。vectorと違い多次元配列に対応しているというメリットはある。 binary GHCに同梱されているシリアライズライブラリ。非常に遅い。 extensible 拡張可能レコードやエフェクトに関して最も機能が整っているが、そもそも必要な場面が少ない。 HTTP ど直球なネーミングの、HTTPで通信するライブラリ。独自クラスによる抽象化が多いためあまりエレガントとは言えず、近年必須レベルと化しているHTTPSに対応していないのも痛い。 OpenGL OpenGLのラッパーだが、その中途半端な抽象化が仇となり本来のAPIとの対応関係を理解するのが難しい。生のバインディングであるglパッケージのほうが使いやすく網羅性も高い。 parsec 老舗のパーサコンビネータ。baseと被る関数名の数々やパフォーマンスなどに難あり。 scalpel スクレイピング用ライブラリ。APIは扱いやすいがメモリリーク疑惑がある。 D Tier
これらを依存に加えるときは、白い目で見られることを覚悟したほうがいいかもしれない。
list-t ListTの正しい実装で、もちろんtransformersのListTよりマシだが遅すぎて実用性を欠く。 generic-deriving ジェネリクスによって数々の型クラスのインスタンスを導出するというコンセプトのライブラリだが、そのクラスが謎の再定義をされたものなのでbaseと互換性がなく、実用性も乏しい。あくまで教育目的のパッケージなので、実用する際はgeneric-dataを代わりに使おう。 F Tier
今これらを使う理由はほぼない。
hxt 老舗のArrowベースのXML操作ライブラリ。抽象化の仕方に強い癖があるだけでなく想像を絶するほどモジュール数が多く、習得が極めて困難。 合わせて読みたい