2016-09-02 11 views
9

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 

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ì?

+0

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

+0

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

+0

@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

Trả lời

3

Chiến lược sửa chữa tốt là gì?

Tôi yêu cầu bạn đặt cabalize mã và sử dụng hộp cát cabal hoặc stack. Nó sẽ ngăn chặn vấn đề ở nơi đầu tiên. Để sửa chữa, bạn nên tìm hiểu gói nào được cài đặt hai lần (có vẻ như là bytestring) và hủy đăng ký gói đó.

Tôi hơi e ngại về việc tôi phải làm gì để tìm ra điều đó: 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 trường hợp cho toàn bộ Foo khác" .

Tôi know những gì bạn cảm thấy.May mắn thay nó đã là fixed, vì vậy bạn sẽ nhận được thông báo lỗi tốt hơn từ ghc-8

+0

Tuyệt vời! Tôi mong được nâng cấp lên ghc 8, mà tôi sẽ làm ngay sau khi sửa lỗi https://ghc.haskell.org/trac/ghc/ticket/12007 làm cho nó ra khỏi đó. Yêu cầu cài đặt đồng thời cabal của mysql-đơn giản và bytestring mới hơn đã cho tôi ra khỏi lỗ. Cabalizing chương trình mục đích duy nhất của tôi chỉ nhỏ-một-địa-đặc biệt sẽ thêm chi phí đáng kể. – pigworker

Các vấn đề liên quan