1. ホーム
  2. haskell

[解決済み] mtl、トランスフォーマー、monads-fd、monadLib、そして選択のパラドックス

2023-02-08 06:53:07

質問

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-fdmonads-tf はアドオンで transformers の機能を提供するもので、それぞれ機能依存と型ファミリを使用します。 mtl に欠けている機能を transformers .
  • mtl-tfmtl はタイプファミリを使って再実装されます。

つまり本質的には 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ページ半で、世界のあらゆる問題を解決してしまうのです。 <ストライク 理解しがたい抽象的なナンセンス 息を呑むほど一般的なコードです。