この質問は、
`MonadIO` 型変数を持つクラスのインスタンスを変換されたモナドに持ち上げる
これは、これが使用されるアプリケーションの例を提供します。
アイデアは、型クラス
class (Monad m) => Class m a where
method :: a -> m ()
異なるモナドに基底インスタンスが存在する
instance Class M A where
method = undefined
instance Class (T M) B where
method = undefined
. 私が欲しいのは、任意のインスタンスをそれ自体、またはトランスフォーマー スタックの上位に持ち上げる方法liftIO
ですIO
。私の最初のアイデアは、持ち上げインスタンスを定義することでした
instance (MonadTrans t, Class m a) => Class (t m) a where
method = lift . method
lift
ただし、これには、ポリモーフィックと同様に、複数のトランスフォーマーが適用されたときに重複するインスタンスが作成されるという問題があり、たとえばlift . lift
.
代わりに同様のデフォルト インスタンスを使用することが提案されましたが、
class (Monad m) => Class m a where
method :: a -> m ()
default method :: (m ~ t n, MonadTrans t, Class n a) => a -> m ()
method = lift . method
その後、リフティング インスタンスを宣言するために使用できます
instance (MonadTrans t) => Class (t M) A
instance (MonadTrans t) => Class (t (T M)) B
. これは機能しますが、リフティング インスタンスはベース インスタンスごとに宣言する必要があるため、興味があります。重複するインスタンスに頼らずにこれを解決する他の方法はありますか?