95

Hackage には、モナド変換子用のパッケージがいくつかあります。

  • mtl : モナド変換ライブラリ
  • トランスフォーマー: 具体的なファンクターとモナドのトランスフォーマー
  • monads-fd : 機能依存関係を使用するモナドクラス
  • monads-tf : 型ファミリーを使用したモナドクラス
  • monadLib : モナド変換子のコレクション。
  • mtl-tf : 型ファミリーを使用したモナド変換ライブラリ。
  • mmtl : Modular Monad Transformer ライブラリ
  • mtlx : 型インデックスを持つ Monad 変換ライブラリで、「無料」のコピーを提供します。
  • compose-trans : 構成可能なモナド変換子

(そして多分私はいくつかを逃した)

どちらを使用しましょうか。

mtl は Haskell Platform のものですが、reddit ではクールではないという声をよく耳にします。

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

たとえば、 data-accessor の作成者が、一般的な選択肢だけに対応するために、これらすべてを作成する必要があることを見てきました。

  • data-accessor-monadLib ライブラリ: monadLib のモナドのアクセサ関数
  • data-accessor-monads-fd ライブラリ: Accessor を使用して monads-fd State モナド クラスの状態にアクセスします
  • data-accessor-monads-tf ライブラリ: Accessor を使用して monads-tf State モナド型ファミリの状態にアクセスします
  • data-accessor-mtl ライブラリ: Accessor を使用して mtl State モナド クラスの状態にアクセスします
  • data-accessor-transformers ライブラリ: Accessor を使用して変換器の状態にアクセスする State モナド

これが続けば、たとえばいくつかの競合する Arrow パッケージが進化すると、次のようなものが表示されるのではないかと想像します。

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

質問:

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

3 に答える 3

74

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

  • mtlGHC 拡張機能を使用しますが、transformersHaskell 98 です。
  • monads-fdmonads-tfは へのアドオンでtransformersあり、それぞれ機能依存関係と型ファミリを使用しており、どちらも にmtl欠けている の機能を提供しますtransformers
  • mtl-tfmtl型ファミリーを使用して再実装されます。

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

mmtlどちらも API の違いと追加機能を備えたmtlxに似ている、および/またはに基づいているようです。mtl

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

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

いずれにせよ、次の決定アルゴリズムをお勧めします。

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

今のところは?おそらく使用する必要がありますmtl。起こっていることは、ライブラリが平和的に共存できるtransformers方法で MTL から取り除かれているということですが、最終的にはまだそうではありませんでした。monads-fdmonads-tf

その場合、 などは のエイリアスになることを除いて、(ほぼ) 同じインターフェースをインポートmonads-fdして取得することができます。transformersStateStateT

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

MonadLibは、Iavor が取り組んできた別の代替手段です。これは、モジュール名を他のモジュールと共有しないため安全に使用できますが、使用パターンがかなり異なります。

于 2010-05-05T00:28:46.943 に答える
18

Edward Kmett が彼の回答で言及している因数分解は2010年後半に完了しましmtlのユビキタス性の結果として、monads -tfが実際に普及することはありませんでした。2017 年の初めの時点で、mtlトランスフォーマーは、広く使用されている唯一のモナド トランスフォーマー ライブラリです。

于 2017-03-04T23:48:51.367 に答える