0

この質問は、

`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

. これは機能しますが、リフティング インスタンスはベース インスタンスごとに宣言する必要があるため、興味があります。重複するインスタンスに頼らずにこれを解決する他の方法はありますか?

4

1 に答える 1