当我在ghci
/ cabal repl
中加载某个文件时,收到以下错误消息:
No instance for (Control.Monad.Trans.Class.MonadTrans
(EitherT Error))
arising from a use of ‘lift’
但是,EitherT a
绝对是MonadTrans
的一个实例;它是包装的一部分。 cabal build
成功;太。由于某种原因,似乎ghci
和cabal 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
答案 0 :(得分:1)
我的猜测,仅从代码中看不到的是,您安装了两个版本的transformers
:一个由GHCi直接加载的较新版本和一个安装使用的旧版本either
包。或者通过间接依赖可能涉及更多的包。
然后一个MonadTrans
与另一个EitherT
混在一起,对此一无所知。
cabal
确保使用一个一致的版本。
要检查是否安装了两个版本,请使用
ghc-pkg list transformers
你可以给GHCi一个-package
标志(或使用:set
)来强制使用一个版本,虽然这只会影响加载的文件,而不会影响已安装的软件包。
此外,现在每个人似乎都在推荐cabal
沙箱,以避免此类问题。