ghci不会解释文件,但是cabal构建成功了吗?

时间:2015-03-06 04:07:02

标签: haskell compilation cabal ghci

当我在ghci / cabal repl中加载某个文件时,收到以下错误消息:

No instance for (Control.Monad.Trans.Class.MonadTrans
                   (EitherT Error))
  arising from a use of ‘lift’

但是,EitherT a绝对是MonadTrans的一个实例;它是包装的一部分。 cabal build成功;太。由于某种原因,似乎ghcicabal repl不了解EitherT类型类实例(liftIO产生类似错误)(但cabal build对此感到满意)?

有没有人遇到过这样的事情?

提前致谢! :)

编辑:

烨;大多数情况都缺失了:

λ :i EitherT
type role EitherT nominal representational nominal
newtype EitherT e (m :: * -> *) a
  = EitherT {runEitherT :: m (Either e a)}
    -- Defined in ‘Control.Monad.Trans.Either’
instance Eq (m (Either e a)) => Eq (EitherT e m a)
  -- Defined in ‘Control.Monad.Trans.Either’
instance Monad m => Monad (EitherT e m)
  -- Defined in ‘Control.Monad.Trans.Either’
instance Monad m => Functor (EitherT e m)
  -- Defined in ‘Control.Monad.Trans.Either’
instance Ord (m (Either e a)) => Ord (EitherT e m a)
  -- Defined in ‘Control.Monad.Trans.Either’
instance Read (m (Either e a)) => Read (EitherT e m a)
  -- Defined in ‘Control.Monad.Trans.Either’
instance Show (m (Either e a)) => Show (EitherT e m a)
  -- Defined in ‘Control.Monad.Trans.Either’
λ

但是,如果我运行cabal get either获取软件包的源代码,并在cabal repl中打开 ,那么 拥有所有实例。所以...呃......为什么在导入包而不是加载源代码时它不知道那些实例?

EDIT5:

好的,这很奇怪。在ghci源目录中运行{{1>}( not cabal repl,然后运行either-4.3.3.2会导致:l src/Control/Monad/Trans/Either.hs丢失类型类实例错误,即EitherT

MonadTrans

1 个答案:

答案 0 :(得分:1)

我的猜测,仅从代码中看不到的是,您安装了两个版本的transformers:一个由GHCi直接加载的较新版本和一个安装使用的旧版本either包。或者通过间接依赖可能涉及更多的包。

然后一个MonadTrans与另一个EitherT混在一起,对此一无所知。

另一方面,

cabal确保使用一个一致的版本。

要检查是否安装了两个版本,请使用

ghc-pkg list transformers

你可以给GHCi一个-package标志(或使用:set)来强制使用一个版本,虽然这只会影响加载的文件,而不会影响已安装的软件包。

此外,现在每个人似乎都在推荐cabal沙箱,以避免此类问题。