2016-09-02 20 views
9

我有一些舊的代碼曾用於編譯,但現在沒有。我擔心我可能會遇到包管理困難,而我在處理這類事情方面真的很糟糕。我已經把它縮小到一個最小的失敗的例子。實例(Param B.ByteString)如何消失?

{-# LANGUAGE OverloadedStrings #-} 

module Gremlin where 

import Database.MySQL.Simple.Param 
import qualified Data.ByteString as SB 

foo :: Param x => [x] 
foo = [] 

shoo :: [SB.ByteString] 
shoo = foo 

我得到的錯誤是

/.../Gremlin.hs:12:8: 
No instance for (Param SB.ByteString) arising from a use of ‘foo’ 
In the expression: foo 
In an equation for ‘shoo’: shoo = foo 

但當我查看源代碼

module Database.MySQL.Simple.Param 
    (
     Action(..) 
    , Param(..) 
    , inQuotes 
    ) where 

我看到

import qualified Data.ByteString as SB 

instance Param SB.ByteString where 
    render = Escape 
    {-# INLINE render #-} 

相關版本信息可能包括

$ ghci --version 
The Glorious Glasgow Haskell Compilation System, version 7.10.2 
$ ghc-pkg latest mysql-simple 
mysql-simple-0.2.2.5 
$ ghc-pkg latest bytestring 
bytestring-0.10.8.1 

當我問ghci的

:info Param 

我得到比MySQL的,簡單的文檔更短名單將導致我的期望。

Prelude> :m + Database.MySQL.Simple.Param Data.ByteString 
Prelude Database.MySQL.Simple.Param Data.ByteString> :info Param 
class Param a where 
    render :: a -> Action 
    -- Defined in ‘Database.MySQL.Simple.Param’ 
instance Param [Char] -- Defined in ‘Database.MySQL.Simple.Param’ 
instance Param Word -- Defined in ‘Database.MySQL.Simple.Param’ 
instance Param a => Param (Maybe a) 
    -- Defined in ‘Database.MySQL.Simple.Param’ 
instance Param Integer -- Defined in ‘Database.MySQL.Simple.Param’ 
instance Param Int -- Defined in ‘Database.MySQL.Simple.Param’ 
instance Param Float -- Defined in ‘Database.MySQL.Simple.Param’ 
instance Param Double -- Defined in ‘Database.MySQL.Simple.Param’ 
instance Param Bool -- Defined in ‘Database.MySQL.Simple.Param’ 
instance Param Action -- Defined in ‘Database.MySQL.Simple.Param’ 

但我想只告訴我範圍內的本地實例。然後我做

Prelude Database.MySQL.Simple.Param Data.ByteString> :m +Data.Text 
Prelude Database.MySQL.Simple.Param Data.ByteString Data.Text> :info Param 
class Param a where 
... 
instance Param Text -- Defined in ‘Database.MySQL.Simple.Param’ 
... 

進一步調查點問題的潛在來源:

$ ghc-pkg describe mysql-simple 
name: mysql-simple 
version: 0.2.2.5 
... 
depends: 
... 
    bytestring-0.10.6.0-6e8453cb70b477776f26900f41a5e17a 
... 

我猜的ByteString與實例是0.10.6.0和獨特的從版本我得到的時候正好寫在我的源文件中相同的導入。如果是這樣的話,我有點深刻的瞭解我需要做多少工作才能找到答案:如果「沒有Foo的實例」會添加「即使有一個其他Foo的實例」也會很好。

這是陰謀地獄吧?我可以使用新版本進行簡單的mysql重建嗎?我試過ghc-pkg unregister mysql-simple,然後cabal install mysql-simple,但無濟於事。

什麼是好的維修策略?

+0

你是否試過在清潔的cabal沙箱中編譯你的代碼? – redneb

+0

我並不擅長爲什麼發生這些事情,但我通常會列出我想要的軟件包以及我需要的具體版本的問題軟件包。所以'cabal安裝mysql-simple bytestring-0.10.8.1'。這通常或者起作用,或者給我一個更好的理由,說明它爲什麼不起作用。 – fryguybob

+0

@redneb我沒有使用沙盒,但我必須安裝mysql-simple和utf8-bytestring。我按照這個順序做了。我認爲可能已經有一箇舊的字節串,但是utf8-bytestring可能帶來了新的字節串,就像沒有警告的災難。 – pigworker

回答

3

什麼是好的維修策略?

我強烈建議您使用cabal sandbox或stack。它應該首先防止這個問題。要進行修復,您應該瞭解兩次安裝了哪個軟件包(它似乎是bytestring)並取消註冊。

對於我需要做多少工作才能找到答案,我有點不解:如果「沒有Foo的實例」會添加「儘管有一個其他Foo的實例」 。

know你的感受。幸運的是它已經是fixed,所以你應該從ghc-8得到更好的錯誤信息

+0

太棒了!我期待升級到ghc 8,我會盡快解決https://ghc.haskell.org/trac/ghc/ticket/12007問題。要求同時安裝mysql-simple和更新的bytestring讓我擺脫困境。將我相當小的只有一個本地特殊用途的程序進行細化會增加相當大的開銷。 – pigworker