Haskell 其中一个依赖项的覆盖率条件失败

Haskell 其中一个依赖项的覆盖率条件失败,haskell,Haskell,我试图编写使用单子变换器的函数,但是对于我的单子类型的确切结构是不可知的。不过,我并不完全明白我在做什么——试图听从哈斯克尔(haskell)的建议。我想写一个函数,比如 doSomething :: (MonadRandom m, MonadError MyError m ) => Arg -> m Result (其中m是添加随机发生器状态和错误处理的monad变压器堆栈) 我开始写一些状态: {-# LANGUAGE GeneralizedNewtypeDeriving, M

我试图编写使用单子变换器的函数,但是对于我的单子类型的确切结构是不可知的。不过,我并不完全明白我在做什么——试图听从哈斯克尔(haskell)的建议。我想写一个函数,比如

doSomething :: (MonadRandom m, MonadError MyError m ) => Arg -> m Result
(其中m是添加随机发生器状态和错误处理的monad变压器堆栈)

我开始写一些状态:

{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses, FlexibleInstances #-}

import System.Random
import Control.Monad.Error
import Control.Monad.State

{-
-- I want to make a class of monads which contain random generator state.
class Monad m => RandMonad m where
  putGen :: StdGen -> m ()
  getGen :: m StdGen
-}

-- the following creates a monadic type BT
data BTState = BTState
 { bGoalN :: Int
 , bRandState :: StdGen }
newtype BT m a = BT { runBT :: StateT BTState m a }

-- what the following does is say that if e and m can be used the 
-- way a monad error can be used, then so can e and (BT m)
instance MonadError e m => MonadError e (BT m) where
   throwError x = BT (throwError x)
   -- edit: I added the following definition but I'm still getting the same error
   -- In fact I tried every conceivable definition of catchError and still get the
   -- same error about the coverage condition
   catchError (BT x) y = BT (catchError y)
当我运行这个程序时,我得到了“MonadError e(BT m)的非法实例声明”(它的一个依赖项的覆盖条件失败)


我是haskell新手,所以我不知道这意味着什么。

覆盖条件与您如何实现实例无关。在MonadError的定义中

class (Monad m) => MonadError e m | m -> e where
函数依赖性表示,对于给定的实例
m
,我们必须能够唯一地确定
e

问题是在你的定义中

instance MonadError e m => MonadError e (BT m) where
GHC无法确定从
BT m
我们可以确定
m
,从
m
(使用实例
MonadError em
)我们可以确定
e
。因此,为了定义实例,需要启用
不可判定实例
。另见。请注意,所有
MonadError
实例都是这样定义的,请参阅


在您的情况下,我建议使用现有的及其相应的monad转换器。您必须自己为
RandT
定义一个
MonadError
实例。

编辑以反映定义
catchError