ghci 不会解释文件但 cabal build 成功了吗?

ghci won't interpret file but cabal build succeeds?

当我加载 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 中,它 确实 拥有所有实例。所以...呃...为什么当我导入包而不是加载源代码时它不知道这些实例?

编辑5:

好吧,这真的很奇怪。 运行 ghci (not cabal repl inside either-4.3.3.2 source directory and then 运行ning :l src/Control/Monad/Trans/Either.hs produces EitherT 缺少类型类实例错误,即 MonadTrans

λ :l src/Control/Monad/Trans/Either.hs
[1 of 1] Compiling Control.Monad.Trans.Either ( src/Control/Monad/Trans/Either.hs, interpreted )

src/Control/Monad/Trans/Either.hs:287:14:
    Could not deduce (transformers-0.3.0.0:Control.Monad.Trans.Class.MonadTrans
                        (EitherT e))

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

然后一个的 MonadTrans 与另一个一无所知的 EitherT 混合在一起。

cabal,另一方面,确保使用一个一致的版本。

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

ghc-pkg list transformers

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

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