当我在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
,它确实拥有所有的实例。所以...呃...为什么当我导入软件包而不是加载源代码时,它们不知道那些实例?
编辑5:
好的,这很奇怪。运行ghci
(不是 cabal repl
内either-4.3.3.2
源目录,然后运行:l src/Control/Monad/Trans/Either.hs
产生缺失的类型类的实例错误的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直接加载的较新版本和由已安装either
软件包使用的较旧版本。或者可能通过间接依赖关系涉及更多的程序包。
然后,MonadTrans
从一个混入另一个混在一起EitherT
,对此一无所知。
cabal
另一方面,请确保使用一个一致的版本。
要检查是否安装了两个版本,请使用
ghc-pkg list transformers
您可以给GHCi一个-package
标志(或使用:set
)来强制使用一个版本,尽管这只会影响加载的文件,而不影响已安装的软件包。
而且,cabal
这些天似乎每个人都建议使用沙箱来避免此类问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句