mtl、transformers、monads-fd、monadLib、および選択したパラドックス


92

Hackageにはモナド変換のためのいくつかのパッケージがあります:

  • mtl:モナド変換ライブラリ
  • トランスフォーマー:コンクリートファンクターおよびモナドトランスフォーマー
  • monads-fd:関数の依存関係を使用するモナドクラス
  • monads-tf:タイプファミリーを使用するモナドクラス
  • monadLib:モナド変換子のコレクション。
  • mtl-tf:タイプファミリーを使用するモナド変換ライブラリ。
  • mmtl:モジュラーモナド変換ライブラリ
  • mtlx:タイプインデックス付きのモナド変換ライブラリ。「無料」のコピーを提供します。
  • compose-trans合成可能なモナド変換子

(そしておそらく私はいくつかを逃した)

どれを使用しますか?

mtlはHaskellプラットフォームの1つですが、redditはクールではないと聞いています。

とにかく、選択の何が悪いのですか、それはただ良いことではありませんか?

ええと、たとえば、データアクセサーの作成者がこれらすべてを、人気のある選択だけに応えるために作成しなければならない方法を見ました。

  • data-accessor-monadLibライブラリ:monadLibのモナドのアクセサ関数
  • data-accessor-monads-fdライブラリ:アクセサを使用してモナドfd状態モナドクラスの状態にアクセスする
  • data-accessor-monads-tfライブラリ:アクセサーを使用してモナドtf状態モナドタイプファミリーの状態にアクセスする
  • data-accessor-mtlライブラリ:Accessorを使用してmtl Stateモナドクラスの状態にアクセスする
  • data-accessor-transformersライブラリ:アクセサーを使用してトランスフォーマーの状態モナドの状態にアクセスする

これが続き、たとえばいくつかの競合するArrowパッケージが進化した場合、spoonklink-arrows-transformers、spoonklink-arrows-monadLib、spoonklink-tfArrows-transformers、spoonklink-tfArrows-monadLib、...のように見えるかもしれません。

そして、spoonklinkがフォークされると、Hackageがディスク領域を使い果たしてしまうのではないかと心配しています。:)

質問:

  • なぜそれほど多くのモナド変換パッケージがあるのですか?
  • なぜmtlはクールでないと考えられていますか?
  • 主な違いは何ですか?
  • これらの競合しているように見えるパッケージのほとんどは、Andy Gillが作成し、Ross Patersonが保守しています。これは、これらのパッケージが競合しているのではなく、何らかの方法で連携していることを意味しますか?AndyとRossは、独自のパッケージを廃止されたと見なしていますか?
  • あなたと私はどちらを使うべきですか?

2
このリンクは、MTLとトランスフォーマーの理解に役立ちましたhaskell.org/haskellwiki/Monad_Transformer_Library
Brandon Cook

2
下にスクロールして@jberrymanのコメントを表示します。mtlまたはトランスフォーマーを使用すると、互換性が得られます!
ソフィー

回答:


70

それらの束はほぼ完全に同等です:

  • mtlGHC拡張を使用しますtransformersが、Haskell 98です。
  • monads-fdそして、monads-tfアドオンさにtransformers、両方ともに機能を提供、それぞれの機能の依存関係およびタイプ・ファミリーを使用してmtlから行方不明だということをtransformers
  • mtl-tfされたmtlタイプの家族を使用して再実装。

つまり、本質的にmtl== transformers++ monads-fdmtl-tf== transformers++ monads-tfです。transformersとその関連パッケージの移植性とモジュール性が改善されたことmtlが、最近はクールでない理由だと思います。

mmtlそしてmtlx両方ともに類似および/またはに基づくように見えるmtlAPIの違いや余分な機能を持ちます、。

MonadLib問題についてはかなり異なった見方をしているようですが、私はそれについてはあまり詳しくありません。また、他のものより多くのGHC拡張を使用しているようです。

一見するcompose-transと、モナド変換子を作成するためのメタプログラミングのようなものです。それは互換性がControl.Monad.Transあると主張しています...私はおそらく意味mtlですか?

とにかく、次の決定アルゴリズムをお勧めします。

  • 新しいプロジェクトに標準モナドが必要ですか?transformers&co。を使用して、私たちがmtl休むのを助けてください。
  • すでにmtl大規模なプロジェクトで使用していますか?transformersは完全には互換性がありませんが、切り替えなかったために殺されることはありません。
  • 他のパッケージの1つが、必要な異常な機能を提供していますか?自分でロールするのではなく、使用することもできます。
  • まだ満足していませんか?それらをすべて破棄し、ダウンロードしてcategory-extras、1ページと理解できない抽象的なナンセンスな息をのむほど一般的なコードの半分で、世界中のすべての問題を解決します。

2
mtl ==トランスフォーマー++モナド-fdの場合、この方法で実装することはできませんか?(それを置き換えるフェーズとして)data-accessor-mtlなどのものが必要なくなる
yairchu

2
@yairchu:ええ、でも、私はそれについて何をするつもりですか :)後方互換性を維持することは思ったほど簡単ではありません。主要なライブラリの変更には、時間、労力、およびある程度のコミュニティサポートが必要です。モナドトランスフォーマーの状況は既知の問題ですが、ロングショットでは誰の最優先事項でもないと思います。
CAマッキャン2010年

5
@yairchu:それは基本的に行われていることです。mtlの次のメジャーバージョンは、トランスフォーマー+モナドfdをインポートするスタブである必要があり、そのバージョンとの互換性が決定要因になります。その後、ライブラリを個別に更新してmtl 1.1と1.2の両方と互換性を持たせることができます。その後、アプリは、インストールされているバージョン、またはライブラリの依存関係が最も制限されているバージョンに必要なものにピジョンホールします。
エドワードKMETT

2
ライブラリのメーリングリストは現在、MonadIO(およびおそらくMonadTransをmtlからbaseに移動すること)について議論しています。ただし、「MonadBase」にはMPTCやFundepsなどが必要であるにもかかわらず、MonadIOを抽出するか、より一般的なMonadBaseを抽出するかについては、懸命に取り組んでいます。 。
エドワードKMETT

27
私はこの投稿が非常に有益だったので。他のグーグルを更新すると思いました:mtlはトランスフォーマーに依存するようになり、monads-fdはmtlの周りのスタブになりました。そのため、追加の機能が必要な場合はmtlを使用し、必要なものがすべてある場合はトランスフォーマーをインポートします。
jberryman 2011

20

今のところは?おそらく使用する必要がありますmtl。何が起こっていることはということであるtransformersライブラリがファッションにMTLの因数分解されることmonads-fdmonads-tf共存平和的に、まだそうではありませんでした最後のチェックですることができます。

これが発生すると、などのがのエイリアスになることを除いて、(ほぼ)同じインターフェースをインポートmonads-fdtransformersて取得できます。StateStateT

したがって、私はに書き込みますがmtl、State、Readerなどが現在s dataに置き換えられることになっているという事実には依存しませんtype

MonadLib Iavorが取り組んでいるもう1つの方法は、他のモジュールとモジュール名を共有しないため安全に使用できますが、使用パターンはかなり異なります。


4
どういう意味で共存?同じパッケージで使用されていますか?同じモジュールにインポートされましたか?同じトランススタックに統合されていますか?FundepsとTFを混在させることは、一般的に悪い考えです。とにかく、私はtransformers&coを多用していません。しかし、mtlいくつかの(かなり単純な)コードを切り替えるときと比べて、いくつかの小さなAPIの違い以外の問題に気づきませんでした。
CAマッキャン2010

4
問題は、特定のモジュールを提供するパッケージを1つしかロードできないという事実に帰着します。したがって、内部的にもmtlを使用するライブラリを使用する場合、代替をインポートすることはできません。現在、ハッキングのかなりの割合が内部で何らかの方法でmtlを使用しています。多くの人々はタイプファミリーを使用することを好み、monads-tfはそれを提供しますが、現時点では、transformers + monads-fdリファクタリングが完了するまで、MTLを推移的に必要とするライブラリを使用しないようにコードをロックします。 。これには、かなり大きなチケットアイテムが含まれます。
エドワードKMETT

1
長期的には、transformers + monads-(tf | fd)を使用するとそのピクルスを回避できますが、まだありません。その間、使用の優勢はmtlに有利です。アップグレードパスは、mtlの次のメジャーバージョンがモナドfdとトランスフォーマーをインポートするスタブとして再定義されるようです。メジャーバージョンブレークは、取得するバージョンを気にしない(つまり、Stateがタイプエイリアスまたはデータタイプであることを気にしない)ことをcabalファイルに記載する良い方法を提供し、メジャーバージョンのバンプが発生すると、使用するすべてのライブラリがすべて同じバイアスを共有しているかどうかを気にする必要はありません。
エドワードKMETT

1
つまり、最終的にこれまでの経験は、トランスフォーマー/モナド(tf | fd)がサポートするように設計されたものとまったく同じです。しかし、彼らが書かれた後に実現したことは、コミュニティがライブラリを切り替えるのがかなり途方もなく悪いということでした。したがって、mtlを再定義してアップグレードパスを明確にする必要があります。
エドワードKMETT

すばらしい、詳細な説明に感謝!明らかに、私が切り替えたコードには外部依存関係がほとんどありませんでした。主にFFIバインディングだと思います。また、モジュール名の競合が侵略的であることもわかりませんでした... それは確かに物事をぎこちなくします。:(
CAマッキャン

16

エドワード・クメットが彼の回答で言及し要素の除外は2010年後半に完了しました。その最終結果は、トランスフォーマー上に構築されたモナドfdで、バージョン2のmtlになりました。偏在の結果としてMTLモナド-TFは本当に上のキャッチはありません。2017年の初めの時点では、mtlトランスフォーマーのみが広く使用されているモナドトランスフォーマーライブラリです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.