2012-11-29 21 views
1

我導入包Data.Map這樣的:import qualified Data.Map as M,我與類型的變量:匹配2個Data.Map包版本

> :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個版本混淆,這就是爲什麼會導致錯誤。是嗎?

+0

是的,這就是導致錯誤的原因,你說得對。真正的問題是爲什麼GHC同時加載到不同版本的軟件包。如果你正確地[cabalise](http://www.haskell.org/cabal/users-guide/)你的項目,這應該不會發生。 – leftaroundabout

+0

我想知道是否我們可以導入包裝容器的版本 - 0.4.2.1而不用cabal處理。例如,'導入合格的容器-0.4.2.1:Data.Map爲M' – chipbk10

+0

我註銷了容器0.5.1.0的版本,非常幸運,沒有軟件包依賴性受到影響。編譯是好的。但任何其他建議都是值得歡迎的。謝謝 – chipbk10

回答

1

GHC通常會假定導入應從最新版本的可用包中抽取。可能有東西拉到新版本的容器中作爲依賴。你做的正確的事情就是取消註冊。如果你不想這樣做,你可以使用ghc-pkg hide來防止ghc默認使用它。

在任何情況下,典型的下一步將是找到罪魁禍首包,強迫你拉一個新的容器,並修改它的cabal使用舊的。

這是因爲容器是一個非常靠近依賴鏈的包,更新它通常會迫使你「重建世界」來讓所有其他的東西使用新版本,這通常很困難。