FreeT/ProgramTで作成されたモナドトランスのためのmtlのようなメカニズムがありますか?フリー/動作可能なモナドトランスフォーマーを備えたモナドスタック貫入クラス?
私の歴史の理解は以下の通りです。かつて、モナド変圧器が発明されました。その後モナド変圧器を積み重ね始めてから、どこにでもlift
を挿入するのは面倒です。次に、モナドクラスを発明した人が2人いました。任意のモナドにおけるask :: m r
m
MonadReader r m
のようなものである。これはモナド変圧器のすべてのペアのインスタンス宣言の、このようなペアが必要
(Monoid w, MonadState s m) => MonadState s (WriterT w m)
MonadWriter w m => MonadWriter w (StateT s m)
のように、すべてのモナドクラスは、すべてのモナド変換子に浸透することによって可能であったので、Nモナドがあるとき変圧器があります。n^2がかかります。しかし、これは大きな問題ではありませんでした。なぜなら、人々はほとんどがあらかじめ定義されたモナドを使用し、自分自身を作成することはめったにないからです。これまでの話は分かりました。以下のQ & Aで:
Avoiding lift with Monad Transformers
その後、私の問題は、新しい無料モナドhttp://hackage.haskell.org/package/freeと運用モナドhttp://hackage.haskell.org/package/operationalです。彼らは、ある種の代数的な型(操作上はFunctor
のインスタンスも必要ない)として言語を定義するだけで、私たち自身のDSLを書くことができ、それをモナドとして使うことができます。良いニュースは、私たちが無料でモナドとモナド変圧器を持つことができるということです。モナドクラスはどうですか?悪い知らせは、「私たちはモナド変圧器をほとんど定義しない」という仮定がもはや成り立たないという仮定であるということです。
この問題を理解しようとすると、私は2つのProgramT
を作り、互いに浸透させました。
https://github.com/nushio3/practice/blob/master/operational/exe-src/test-05.hs
operational
パッケージには、モナドのクラスをサポートしていませんので、私は別の実装minioperational
を取って、私が必要として動作するように修正。 https://github.com/nushio3/minioperational
それでも、私は専門的なインスタンス宣言
instance (Monad m, Operational ILang m) => Operational ILang (ProgramT SLang m) where
次の形式の一般的な宣言は決定不能インスタンスにつながるため
を必要としていました。
instance (Monad m, Operational f m) => Operational f (ProgramT g m) where
私の質問はどのように我々はそれが簡単に私たちの業務モナドがお互いに浸透させるために作ることができるということです。または、私の望みは、操作上のモナドが病気になっていることを浸透させることです。
私も浸透 :)
ありがとうございます、Petr。あなたの助けを借りて、(* - > *)を使って2つの型のコンストラクタを組み合わせる方法を理解しました。 https://github.com/nushio3/practice/blob/master/operational/exe-src/test-06.hs コンポジット可能なインタプリタの作成も簡単です: https://github.com/nushio3/practice/ blob/master/operational/exe-src/test-07.hs 「OverlappingInstances」を犠牲にして、2つ以上の言語を作成することもできます。 https://github.com/nushio3/practice/blob/master/operational/exe-src/test-08.hs – nushio