は、私がいる間、指定されたスタックの上部と下部で、モナド変圧器スタックを受け付ける関数を作成しようとしています次のスニペット任意のモナド変圧器スタック
本質的にはimport Control.Monad.Trans
import Control.Monad.Trans.Except
import Control.Monad.Trans.State
newtype MyTransT m a = MyTransT (m a)
foo :: (MonadTrans t, Monad (t (Either e))) => MyTransT (t (Either e)) a -> a
foo = undefined
bar :: MyTransT (StateT Int (Either e)) a
bar = undefined
baz :: MyTransT (StateT Int (StateT Int (Either e))) a
baz = undefined
x = foo bar -- works
y = foo baz -- doesn't work
を考えてみましょう真ん中は何でもかまいません。
foo baz
がCouldn't match type ‘StateT Int (Either e1)’ with ‘Either e0’
で拒否された理由としてしばらくの間、私の頭を悩また後、最終的にそのような場合には、私はt
はそのが正しく入力されたではない、だけではないMonadTrans
されていないStateT Int (StateT Int)
だったと仮定したことが私に起こりました/ kinded。
私がしようとしていることを達成する方法はありますか、それとも別のアプローチを試みるのですか?
実際に 'foo'をどのように動作させるかの具体例を挙げることができますか? – ErikR
タイプが 'T'であるとします。これは' K'タイプのキーで 'V'タイプのコンテナと考えることができます。今度は、それぞれの「V」もこのパターンに従うと想像してください。私は 'foo :: StateT V(t(Either e))a - > StateT T(ReaderT K(t(Either e)))'をしたいと思います。これは 'V'を介してステートフルな操作を行い、' K'の環境を持つ 'T'を介してステートフルな操作に持ち上げます。基本的には、既存のコードを変更することなく、無限に上下に拡張できるツリー構造です。 – user2085282
ここで具体的な例が役立ちます。あなたの質問にそれを入れて、読みやすいようにしてください。 – ErikR