2016-09-02 3 views
9

У меня есть старый код, который использовался для компиляции, но теперь это не так. Я беспокоюсь, что, возможно, попал в управление пакетами snafu, и я действительно плохо разбираюсь в таких вещах. Я сократил его до минимального неудачного примера.Как удалось экземпляру (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 и отличается от версии я получаю, когда запись точно тот же импорт в моем исходном файле. Если это так, я немного разозлился, сколько работы мне пришлось сделать, чтобы найти это: было бы здорово, если бы «No instance for Foo» не добавил бы «даже если есть экземпляр для целого другого Foo».

Это адский ад, верно? Могу ли я сделать mysql-простую перестройку с более новой версией? Я попробовал ghc-pkg unregister mysql-simple, а затем cabal install mysql-simple, но безрезультатно.

Что такое хорошая стратегия ремонта?

+0

Вы пытались скомпилировать свой код в чистой песочнице из песка? – redneb

+0

Я не знаю, почему это происходит, но я обычно перечисляю пакет, который я хочу, и проблемный пакет с конкретной версией, в которой я нуждаюсь. Итак, 'cabal install mysql-simple bytestring-0.10.8.1'. Обычно это работает или дает мне лучшую причину, почему это не сработает. – fryguybob

+0

@redneb Я не использовал песочницу, но мне нужно было установить mysql-simple и utf8-bytestring. И я сделал это в таком порядке. Я думаю, что там, возможно, уже была старая bytestring, но что utf8-bytestring, возможно, привнесло новую, как без предупреждения. – pigworker

ответ

3

Что такое хорошая стратегия ремонта?

Я настоятельно рекомендую вам поместить код и использовать песочницу из песка или stack. Это должно предотвратить проблему в первую очередь. Чтобы восстановить, вы должны выяснить, какой пакет установлен дважды (это, кажется, bytestring) и отменить его.

Я немного раздражен, как много работы, я должен был сделать, чтобы это выяснить: было бы здорово, если бы «Ни одного случая для Foo» не хотел бы добавить «даже если есть экземпляр для всей другой Foo» ,

I know что вы чувствуете.К счастью, это уже fixed, поэтому вы должны получить сообщение об ошибке с ghc-8

+0

Отлично! Я с нетерпением жду обновления до ghc 8, что я сделаю, как только это исправление https://ghc.haskell.org/trac/ghc/ticket/12007 сделает это там. Требовательная одновременная инсталляция mysql-simple и более новая bytestring вывели меня из отверстия. Кабалирование моей довольно небольшой программы только для одного локального специального назначения может привести к значительным накладным расходам. – pigworker

 Смежные вопросы

  • Нет связанных вопросов^_^