我的代码适用于受限于拥有某种状态的monad。 我遇到了问题,因为州有一个需要monad的类型变量。
看起来像:
myget :: MonadState (MyState m A) m => m A
现在,当我尝试使其更具体时,就会出现问题。例如。只需使用StateT
(在某些内部monad im
上):
myget' :: StateT <loops here> im A
myget' :: StateT (MyState <loop> A) im A
myget' :: StateT (MyState (MyState <loop> A) A) im A
myget' :: StateT (MyState (MyState (MyState <loop> A) A) A) im A
...
myget' = myget
显然我不能写这种类型的签名;我甚至不能把它留给类型推断。
我该如何解决这个问题?
我通过使myget
(第一个,一般定义)在monad变换器上工作来解决它,它确实有效,但是代码并没有很好地与其他任何东西一起使用(因为通常是人们与monads变形金刚合作只是monad),所以它不是一个非常好的解决方案。
有什么想法吗?
答案 0 :(得分:4)
newtype
救援! newtype
或data
声明可以打破循环。
newtype MS s m a = MS
{getMS :: StateT (MyState (MS s m) s) m a}
deriving (Functor, Applicative, Monad)
deriving instance Monad m =>
MonadState (MyState (MS s m) s) (MS s m)
instance MonadTrans (MS s) where
lift = MS . lift