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
成功;也。由于某种原因,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
(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
沙箱以避免此类问题。
当我加载 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
(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
沙箱以避免此类问题。