如何根据哪个monad位于变换器堆栈的基础上编写一个行为不同的函数

Ale*_*x R 4 haskell

(在这一点上,这更像是一个我想知道如何解决的难题,而不是我希望在实践中使用的解决方案)

我正在尝试编写一个runDebug具有以下规范的函数:它的参数有类型IO (); 它的返回类型是(Monad m) => m (); 取决于它m,它表现为两种不同的方式之一; 如果MonadIO m,那么runDebug = liftIO,否则runDebug = const (return ()).

我试过的方法依赖于类型类

class MonadDebug m where
  runDebug :: IO () -> m ()
Run Code Online (Sandbox Code Playgroud)

我尝试过使用MonadBase,我尝试过使用MonadIO重叠的实例,但是所有这些实例都遇到了歧义问题.

我想我可以通过为每个变换器编写实例来获得一些工作,但我一直希望避免这种情况.

Dan*_*ner 6

MonadDebug为每个变压器和您感兴趣支持的每个基础monad 写入实例.