[解決済み] mtl、トランスフォーマー、monads-fd、monadLib、そして選択のパラドックス
質問
Hackageにはモナド変換のためのパッケージがいくつかあります。
- mtl : モナドトランスフォーマーライブラリ
- トランスフォーマー : 具体的なファンクタやモナドのトランスフォーマー
- monads-fd : モナドクラス、関数従属を使用
- monads-tf : モナドクラス、タイプファミリーを使用
- モナドリブ : モナドトランスフォーマーのコレクションです。
- mtl-tf : タイプファミリーを用いたモナド変換ライブラリ。
- mmtl : モジュール型モナドトランスフォーマーライブラリ
- mtlx : 型インデックスを持つモナド変換ライブラリで、「自由な」コピーを提供します。
- compose-trans : コンポーザブルモナドトランスフォーマー
(そして多分いくつかは見逃しています)
どれを使おうかな?
mtlはHaskell Platformにあるものですが、redditでかっこ悪いと言われ続けています。
しかし、とにかく選択の何が悪いのか、それは良いことではないのか?
そうですね、例えばdata-accessorの作者が、人気のある選択肢だけに対応するために、これらをすべて作らなければならなかったというのを見ました。
- data-accessor-monadLib ライブラリ。monadLib のモナドのためのアクセッサ関数
- data-accessor-monads-fd ライブラリ。monads-fd Stateモナドクラスの状態にアクセスするためにAccessorを使用する
- data-accessor-monads-tf ライブラリ: Monads-tf Stateモナドタイプファミリーの状態にアクセスするためにAccessorを使用する。
- data-accessor-mtl ライブラリ。Accessorを使用してmtlのStateモナドクラスにアクセスする。
- data-accessor-transformers ライブラリ: Accessorを使用して、transformersのStateモナドにアクセスする。
このまま、例えば競合するいくつかのArrowパッケージが発展していくと、spoonklink-arrows-transformers, spoonklink-arrows-monadLib, spoonklink-tfArrows-transformers, spoonklink-tfArrows-monadLib, ...というようなものが見えてくると想像しているのですが、いかがでしょうか。
それから、もしspoonklinkがフォークされたら、Hackageのディスク容量が足りなくなるんじゃないかと心配です :)
質問です。
- なぜこれほど多くのモナド変換パッケージがあるのでしょうか?
- なぜmtlは[かっこ悪いと]思われているのですか?
- 重要な違いは何ですか?
- これらの一見競合するように見えるパッケージのほとんどは、Andy Gill によって書かれ、Ross Paterson によってメンテナンスされています。これは、これらのパッケージは競合するものではなく、むしろ何らかの形で連携しているということでしょうか? また、Andy と Ross は自分たちのパッケージのどれかが時代遅れであると考えているのでしょうか?
- あなたや私はどちらを使うべきですか?
どのように解決するのですか?
ほぼ完全に等価なものがたくさんあります。
-
mtl
はGHCの拡張を使用していますがtransformers
は Haskell 98 です。 -
monads-fd
とmonads-tf
はアドオンでtransformers
の機能を提供するもので、それぞれ機能依存と型ファミリを使用します。mtl
に欠けている機能をtransformers
. -
mtl-tf
はmtl
はタイプファミリを使って再実装されます。
つまり本質的には
mtl
==
transformers
++
monads-fd
,
mtl-tf
==
transformers
++
monads-tf
. の移植性とモジュール性の向上は
transformers
とそれに関連するパッケージは、なぜ
mtl
は最近かっこ悪いと思います。
mmtl
とか
mtlx
は、どちらも
mtl
をベースにしているようですが、API の違いと追加機能があります。
MonadLib
は、かなり異なる考え方を持っているようですが、私は直接はよく知りません。また、他のものより、多くのGHC拡張を使用しているようです。
一目でわかるように
compose-trans
は、モナド変換器を作るためのメタプログラミングのようなものだと思われます。との互換性があると主張しています。
Control.Monad.Trans
とは... ということは
mtl
?
とりあえず、以下のような判定アルゴリズムを提案します。
-
新しいプロジェクトに標準的なモナドが必要ですか?使用する
transformers
& co.の敷設を手伝ってください。mtl
を休ませる。 -
既に使用している
mtl
を大規模なプロジェクトで使用していますか?transformers
は完全に互換性があるわけではありませんが、切り替えなかったからといって、誰もあなたを殺すことはありません。 - 他のパッケージのどれかが、あなたが必要とする珍しい機能を提供していませんか? 自分でローリングするよりも、それを使ったほうがいいかもしれません。
-
まだ不満ですか?全部捨てて、ダウンロード
category-extras
の1ページ半で、世界のあらゆる問題を解決してしまうのです。 <ストライク 理解しがたい抽象的なナンセンス 息を呑むほど一般的なコードです。
関連
-
[解決済み] 読んで学ぶべき良いHaskellのソース [終了しました]。
-
[解決済み] Haskellで副作用がモナドとしてモデル化されているのはなぜですか?
-
[解決済み] Haskellにはなぜ "data "と "newtype "があるのですか?重複] [重複] [重複
-
[解決済み] 制約条件付き特殊化
-
[解決済み] なぜ依存型でないのか?
-
[解決済み] ハスケル Where vs. Let
-
[解決済み] Haskell型とデータコンストラクタ
-
[解決済み] このフィボナッチ関数はどのようにメモされているのですか?
-
[解決済み] <*>は何と呼ばれ、何をするのですか?[クローズド]
-
[解決済み] Haskellの「何もしない」関数、idはなぜ大量のメモリを消費するのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Haskell - Ord aの型は何を意味するのでしょうか?
-
[解決済み] Haskell タプルをリスト化する?
-
[解決済み] Haskellでメモ化?
-
[解決済み] レコードの単一フィールドを割り当て、残りのフィールドはコピーするための省略記法?
-
[解決済み] 無限リストでのfoldlとfoldrの動作
-
[解決済み] なぜ遅延評価が有効なのか?
-
[解決済み] Haskell エラー 入力 `=' のパースエラー
-
[解決済み] <*>は何と呼ばれ、何をするのですか?[クローズド]
-
[解決済み] Real World Haskellのどの部分が今となっては時代遅れ、あるいはバッドプラクティスと考えられているのでしょうか?
-
[解決済み] fixの使い方、効果について教えてください。