Tôi có một số mã cũ được sử dụng để biên dịch, nhưng bây giờ nó không. Tôi lo lắng tôi có thể đã đạt được một snafu quản lý gói, và tôi thực sự rất tệ khi xử lý những thứ đó. Tôi đã cắt nó xuống một ví dụ thất bại tối thiểu.Trường hợp đã có (Param B.ByteString) được quản lý để biến mất như thế nào?
{-# 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
Các lỗi tôi nhận được là
/.../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
Nhưng khi tôi nhìn vào mã nguồn cho
module Database.MySQL.Simple.Param
(
Action(..)
, Param(..)
, inQuotes
) where
tôi thấy
import qualified Data.ByteString as SB
và
instance Param SB.ByteString where
render = Escape
{-# INLINE render #-}
liên quan thông tin phiên bản có thể bao gồm
$ 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
Khi tôi hỏi ghci
:info Param
tôi nhận được một danh sách ngắn hơn so với các tài liệu mysql-đơn giản sẽ đưa tôi đến với mong đợi.
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’
nhưng tôi cho rằng chỉ cho tôi biết các trường hợp về phạm vi cục bộ. Sau đó tôi làm
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’
...
điểm điều tra sâu hơn với một nguồn tiềm năng của rắc rối:
$ ghc-pkg describe mysql-simple
name: mysql-simple
version: 0.2.2.5
...
depends:
...
bytestring-0.10.6.0-6e8453cb70b477776f26900f41a5e17a
...
Tôi đoán rằng ByteString
với các trường hợp là từ 0.10.6.0
và khác biệt so với phiên bản tôi nhận được khi ghi chính xác cùng một tệp nhập trong tệp nguồn của tôi. Nếu vậy, tôi hơi ngượng ngùng về việc tôi phải làm bao nhiêu công việc để tìm ra điều đó: nó sẽ tuyệt vời nếu "Không có trường hợp nào cho Foo" sẽ thêm "mặc dù có một ví dụ cho một Foo khác".
Đây là địa ngục, đúng không? Tôi có thể xây dựng lại mysql-simple với phiên bản mới hơn không? Tôi đã thử ghc-pkg unregister mysql-simple
và sau đó cabal install mysql-simple
, nhưng không có kết quả.
Chiến lược sửa chữa tốt là gì?
Bạn đã cố gắng biên dịch mã của mình trong hộp cát cabal sạch chưa? – redneb
Tôi không có chuyên gia về lý do tại sao những điều này xảy ra, nhưng tôi thường liệt kê gói tôi muốn và gói có vấn đề với phiên bản cụ thể mà tôi cần. Vì vậy, 'cabal install mysql-simple bytestring-0.10.8.1'. Điều này thường hoặc là công trình hoặc cho tôi một lý do tốt hơn tại sao nó sẽ không hoạt động. – fryguybob
@redneb Tôi đã không sử dụng một sandbox, nhưng tôi đã phải cài đặt mysql-đơn giản và utf8-bytestring. Và tôi đã làm theo thứ tự đó. Tôi nghĩ rằng có thể đã có một cũ bytestring đã có, nhưng utf8-bytestring có thể đã mang lại trong một cái mới, giống như một thảm họa không có cảnh báo. – pigworker