【问题标题】:Matching 2 Data.Map package versions匹配 2 个 Data.Map 包版本
【发布时间】:2012-11-29 18:16:29
【问题描述】:

我像这样导入包 Data.Map:import qualified Data.Map as M,我有一个类型为:

> :t particleMap 
particleMap :: M.Map PID (Particle (Float, Float))

现在,我想将我的变量particleMap 传递给一个类型如下的数据:

> :t Ensemble
Ensemble
  :: [([Edge], Point v -> Point v -> v)]
     -> containers-0.4.2.1:Data.Map.Map PID (Particle v) -> Ensemble v

请看一下第二个参数。它是containers-0.4.2.1:Data.Map.Map PID (Particle v),不像Data.Map.Map,或者不像M.Map。最后,它会导致如下错误:

Couldn't match expected type `containers-0.4.2.1:Data.Map.Map
                                    PID (Particle (Float, Float))'
                with actual type `M.Map PID (Particle (Float, Float))'

我仔细检查了包容器的版本,我发现我已经安装了 2 个版本:

安装的版本:0.4.2.1、0.5.1.0

所以,我猜,计算机与 2 个版本混淆,这就是导致错误的原因。是吗?

【问题讨论】:

  • 是的,这就是导致错误的原因,你说得对。真正的问题是为什么 GHC 会同时加载到不同版本的包。如果您正确地cabalise 您的项目,则永远不会发生这种情况。
  • 我想知道我们是否可以在不使用 cabal 处理的情况下准确导入包 container-0.4.2.1 的版本。例如,import qualified containers-0.4.2.1:Data.Map as M
  • 我注销了容器 0.5.1.0 的版本,很幸运没有包依赖受到影响。而且编译没问题。但欢迎任何其他建议。谢谢
  • 您可以使用 GHC(和 GHCi)标志 -package containers-0.4.2.1 来使用早期版本,而无需卸载较新版本。除非您使用公开 Data.Map.Map 的函数(不仅仅是在内部使用它)并且针对不同版本的容器编译,否则这不会导致任何问题,并且您应该能够使用 OPTIONS_GHC pragma 在源代码中指定它文件。

标签: haskell


【解决方案1】:

GHC 通常会假设导入应该从所有可用包的最新版本中提取。可能在新版本的容器中引入了一些依赖项。您所做的正确做法是取消注册。如果您不想这样做,您可以使用ghc-pkg hide 来阻止 ghc 默认使用它。

在任何情况下,典型的下一步是找到迫使您拉出新容器的罪魁祸首包,并修改其阴谋集团以使用旧的。

这是因为容器是一个非常依赖于依赖链的包,更新它通常会迫使您“重建世界”以使其他所有东西都使用新版本,这通常非常困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 2019-11-07
    • 1970-01-01
    • 2018-05-26
    • 2021-10-16
    • 2013-06-18
    • 1970-01-01
    相关资源
    最近更新 更多