如何实例(参数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-simple文档引导我期望的更短的列表。

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-simple吗?我尝试了ghc-pkg unregister mysql-simplecabal install mysql-simple,但都无济于事。

什么是好的修复策略?

什么是好的修复策略?

我强烈建议您对代码进行组合,并使用组合沙盒或stack。它应该首先防止这个问题。要修复,您应该找出安装了两次的包(似乎是bytestring)并取消注册。

我对自己做了这么多工作才发现这一点有点恼火:如果"没有Foo的实例"能加上"即使有一个完整的其他Foo的实例",那就太好了。

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

最新更新