У меня есть старый код, который использовался для компиляции, но теперь это не так. Я беспокоюсь, что, возможно, попал в управление пакетами 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
, но безрезультатно.
Что такое хорошая стратегия ремонта?
Вы пытались скомпилировать свой код в чистой песочнице из песка? – redneb
Я не знаю, почему это происходит, но я обычно перечисляю пакет, который я хочу, и проблемный пакет с конкретной версией, в которой я нуждаюсь. Итак, 'cabal install mysql-simple bytestring-0.10.8.1'. Обычно это работает или дает мне лучшую причину, почему это не сработает. – fryguybob
@redneb Я не использовал песочницу, но мне нужно было установить mysql-simple и utf8-bytestring. И я сделал это в таком порядке. Я думаю, что там, возможно, уже была старая bytestring, но что utf8-bytestring, возможно, привнесло новую, как без предупреждения. – pigworker