5

のドキュメントは、 と を使用し てmonad-controlインスタンスを作成する方法の例を提供します。例は次のとおりです。MonadTransControldefaultLiftWithdefaultRestoreTnewtype

newtype CounterT m a = CounterT {unCounterT :: StateT Int m a}

newtypeこの例は、「基本的な」モナド変換子を 1 つだけ使用して定義されたもの (transformersまたはのものなど)に対して機能するように調整できますmtl。しかし、スタックに 2 つの「基本的な」トランスフォーマーが含まれている場合はどうでしょうか。たとえば、MonadTransControl次のようなインスタンスをどのように定義できますか。

newtype T m a = T {unT :: MaybeT (StateT Int m) a}

私の問題は、次の行を調整する方法がわからないことです

newtype StT CounterT a = StCounter {unStCounter :: StT (StateT Int) a}

から、CounterT私のT変圧器で機能するようにします。特に、最後の括弧に何を入れればよいかわかりません。それは親切なものを期待しています(* -> *) -> * -> *が、私はそのようなものを形成することはできません.

何か案は?

4

1 に答える 1