实例(Param B.ByteString)如何成功消失?

pig*_*ker 9 mysql haskell cabal

我有一些旧代码用于编译,但现在它没有.我担心我可能会遇到一个包管理问题,我真的很难处理这类事情.我把它简化为一个最小的失败的例子.

{-# 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
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

/.../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
Run Code Online (Sandbox Code Playgroud)

但是当我查看源代码时

module Database.MySQL.Simple.Param
    (
      Action(..)
    , Param(..)
    , inQuotes
    ) where
Run Code Online (Sandbox Code Playgroud)

我知道了

import qualified Data.ByteString as SB
Run Code Online (Sandbox Code Playgroud)

和

instance Param SB.ByteString where
    render = Escape
    {-# INLINE render #-}
Run Code Online (Sandbox Code Playgroud)

相关版本信息可包括

$ 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
Run Code Online (Sandbox Code Playgroud)

当我问ghci

:info Param
Run Code Online (Sandbox Code Playgroud)

我得到一个比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’
Run Code Online (Sandbox Code Playgroud)

但我想这只会告诉我本地范围内的实例.然后我做

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’
...
Run Code Online (Sandbox Code Playgroud)

进一步的调查指出了潜在的麻烦来源:

$ ghc-pkg describe mysql-simple
name: mysql-simple
version: 0.2.2.5
...
depends:
...
    bytestring-0.10.6.0-6e8453cb70b477776f26900f41a5e17a
...
Run Code Online (Sandbox Code Playgroud)

我猜这个ByteString实例来自0.10.6.0和我在源文件中编写完全相同的导入时获得的版本不同.如果是这样的话,我有点担心我必须做多少工作才能找到答案:如果"没有Foo的实例"会添加"即使有一个其他Foo的实例"也会很棒.

这是阴谋,对吗?我可以使用较新的版本进行mysql-simple rebuild吗?我试过ghc-pkg unregister mysql-simple然后cabal install mysql-simple,但无济于事.

什么是良好的修复策略?

Yur*_*ras 4

什么是好的修复策略?

我强烈建议您对代码进行 Cabalize 并使用 cabal 沙箱或stack. 它应该首先防止这个问题。要修复,您应该找出哪个软件包安装了两次(似乎是bytestring)并注销它。

我对我必须做多少工作才能发现这一点感到有点恼火:如果“没有 Foo 的实例”添加“即使有一个完整的其他 Foo 的实例”,那就太好了。

我懂得你的感受。幸运的是它已经被修复了,所以你应该得到更好的错误消息ghc-8