5

这个从http://book.realworldhaskell.org/read/monad-transformers.html复制的 MonadState 实例给我一个 GHC 7.4.2 错误

instance (MonadState s m) => MonadState s (MaybeT m) where
  get = lift get
  put k = lift (put k)

    Illegal instance declaration for `MonadState s (MaybeT m)'
  (All instance types must be of the form (T a1 ... an)
   where a1 ... an are *distinct type variables*,
   and each type variable appears at most once in the instance head.
   Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `MonadState s (MaybeT m)'

如果我添加 XFlexibleInstances,然后我会被告知要添加 XUndecidableInstances - 我认为我不应该在这里需要这些扩展。如何让这个实例编译?

4

1 回答 1

5

当您查看http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/src/Control-Monad-State-Class.html#MonadState时,您会发现它也用于“官方”实施,所以我想它是必要的。评论说它与覆盖条件有关,这在这些 stackoverflow 问题中进行了解释:

在这种情况下,变量 s 不存在于右侧,并且函数依赖关系从右到左,因此您的实例无效。(没有 UndecidableInstances)

于 2013-06-27T18:58:04.620 回答