Haskell Haskeline:为`ReaderT r(StateT s m)`stack实现`MonadException`实例

Haskell Haskeline:为`ReaderT r(StateT s m)`stack实现`MonadException`实例,haskell,Haskell,假设我有下面的monad转换器堆栈(r和s为简单起见保留为()) newtype MyMonad ma=MM(ReaderT()(StateT()ma) 如果我想使用它作为haskeline的输入的基本monad,我需要一个System.Console.haskeline.MonadException实例。考虑到这些实例的复杂性,我更愿意让编译器使用GeneralizedNewtypeDeriving为我派生它。具体地说,我希望下面的类型检查 {-#语言通用化newtypederiving、s

假设我有下面的monad转换器堆栈(
r
s
为简单起见保留为
()

newtype MyMonad ma=MM(ReaderT()(StateT()ma)
如果我想使用它作为haskeline的
输入的基本monad,我需要一个
System.Console.haskeline.MonadException
实例。考虑到这些实例的复杂性,我更愿意让编译器使用
GeneralizedNewtypeDeriving
为我派生它。具体地说,我希望下面的类型检查

{-#语言通用化newtypederiving、standaronederiving、FlexibleContexts}
进口控制单体状态
导入Control.Monad.Reader
导入控制.Monad.IO.Class
导入控制
导入System.Console.Haskeline.MonadException
newtype MyMonad m a=MM(ReaderT()(StateT()m)a)
派生(函子、应用程序、单子、单子)
派生实例(MonadException m)=>MonadException(MyMonad m)
但可悲的是,这给了我

/home/bgamari/hi.hs:11:1:
无法推断(MonadException(StateT()m))
源于实例声明的超类
从上下文(MonadIO(MyMonad m),MonadException m)
受/home/bgamari/hi.hs:11:1-66中的实例声明约束
可能的解决方案:
为(MonadException(StateT()m))添加实例声明
在“MonadException(MyMonad m)”的实例声明中
查看为
StateT
ReaderT
提供的实例

instance MonadException m=>MonadException(ReaderT r m)
实例MonadException m=>MonadException(StateT s m)

期望编译器推断出
StateT
实例似乎是完全合理的。我是否期望太多狡猾的
GeneralizedNewtypeDeriving
?如果没有开放编码,如何实现这个实例?

有两个版本的State monad:and.
导入控制.monad.State
,但是inst
MonadException
的定义似乎适用于严格版本


尝试使用
import Control.Monad.State.Strict
而不是
import Control.Monad.State
有两种版本的状态Monad:and.
import Control.Monad.State
,但是
MonadException
的实例似乎适用于Strict版本


尝试使用
导入控制.Monad.State.Strict
而不是
导入控制.Monad.State

是的,似乎你是对的。我认为这实际上使这个问题重复了问题#16944016是的,似乎你是对的。我认为这实际上使这个问题重复了问题#16944016