私はおそらく不可能なことをしようとしています。のインスタンスである型がありますMonadIO
。この型がトランスフォーマー スタックのベース モナドであるコンテキストでアクションを実行liftIO
すると、正常に動作します。IO
だから、私ができるようにしたいのは、すでに途中で(私のタイプに)持ち上げられた値を取り、それを「残りの方法で」1ステップで持ち上げることです。
これには 2 つの方法があります。1 つは、私の型を実際に通常の IO に簡単に再埋め込むことができるということです。
liftMore :: (MonadIO m) => MyType a -> m a
liftMore x = liftIO $ embedMyTypeInIO x
そして、これは機能します。しかし、これは、単に が基底モナドであるコンテキストで使用された場合、my 型から完全にエスケープする方法も提供しますIO
。これは望ましくありません。
私の型をベースとして使用するような新しい型クラスを構築することでこれを行うこともできMonadIO
ますが、すべてに対してインスタンス化する必要があり、これは非常に望ましくありません。newtype ラッパーを使用して、すべてのモナド変換子をそのようなクラスのインスタンスにしようとしましたが、うまく取得できませんでした。
これを達成するために私が試みることができる戦略についてのアイデアはありますか? (私は言語拡張で遊んでみたいと思っていますが、もちろん Haskell98 であるソリューションがはるかに望ましいです)。