Haskell Haskeline:为`ReaderT r(StateT s m)`stack实现`MonadException`实例
假设我有下面的monad转换器堆栈(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
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
,但是instMonadException
的定义似乎适用于严格版本
尝试使用import Control.Monad.State.Strict
而不是import Control.Monad.State
有两种版本的状态Monad:and.import Control.Monad.State
,但是MonadException
的实例似乎适用于Strict版本
尝试使用导入控制.Monad.State.Strict
而不是导入控制.Monad.State
是的,似乎你是对的。我认为这实际上使这个问题重复了问题#16944016是的,似乎你是对的。我认为这实际上使这个问题重复了问题#16944016