类型包含自身时该怎么办?

时间:2016-09-28 18:28:05

标签: haskell

我的代码适用于受限于拥有某种状态的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),所以它不是一个非常好的解决方案。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

newtype救援! newtypedata声明可以打破循环。

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