2016-09-02 8 views
9

मैं कुछ पुराने कोड है जो संकलित करने के लिए प्रयोग किया जाता है, लेकिन अब ऐसा नहीं है। मुझे चिंता है कि मैंने एक पैकेज प्रबंधन स्नफू मारा होगा, और मैं उस तरह की चीज़ से निपटने में वास्तव में बुरा हूं। मैंने इसे कम से कम असफल उदाहरण में घटा दिया है।उदाहरण कैसे है (पैरा बीबीटेस्ट्रिंग) गायब हो गया?

{-# 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 
... 

मेरा अनुमान है कि कि उदाहरण के साथ ByteString0.10.6.0 से है और विशिष्ट जब वास्तव में लिखने मेरी स्रोत फ़ाइल में एक ही आयात। यदि ऐसा है, तो मुझे थोड़ा सा पता चला है कि मुझे यह पता लगाने के लिए कितना काम करना पड़ा: यह अच्छा होगा अगर "फू के लिए कोई उदाहरण नहीं" होगा, भले ही एक पूरे दूसरे फू के लिए कोई उदाहरण हो "।

यह कबाल नरक, सही है? क्या मैं नए संस्करण के साथ mysql-simple पुनर्निर्माण कर सकता हूं? मैं ghc-pkg unregister mysql-simple और फिर cabal install mysql-simple, लेकिन कोई फायदा नहीं हुआ।

एक अच्छा मरम्मत रणनीति क्या है?

+0

से बेहतर त्रुटि संदेश प्राप्त करना चाहिए क्या आपने अपने कोड को क्लीन कैबल सैंडबॉक्स में संकलित करने का प्रयास किया है? – redneb

+0

मैं इन चीजों में क्यों कोई विशेषज्ञ नहीं हूं, लेकिन मैं आम तौर पर इच्छित पैकेज को सूचीबद्ध करता हूं और मुझे आवश्यक विशिष्ट संस्करण के साथ समस्याग्रस्त पैकेज सूचीबद्ध करता हूं। तो 'cabal mysql-simple bytestring-0.10.8.1' स्थापित करें। यह आमतौर पर काम करता है या मुझे एक बेहतर कारण देता है कि यह क्यों काम नहीं करेगा। – fryguybob

+0

@redneb मैंने सैंडबॉक्स का उपयोग नहीं किया, लेकिन मुझे mysql-simple और utf8-bytestring इंस्टॉल करना पड़ा। और मैंने इसे उस क्रम में किया था। मुझे लगता है कि वहां पहले से ही पुराना हो सकता है, लेकिन यूटीएफ 8-बायटेस्ट्रिंग ने किसी नए चेतावनी की तरह, एक चेतावनी आपदा की तरह लाया होगा। – pigworker

उत्तर

3

एक अच्छा मरम्मत रणनीति क्या है?

मैं आपको कोड को कैबलाइज करने और कैबल सैंडबॉक्स या stack का उपयोग करने का आग्रह करता हूं। इसे इस मुद्दे को पहले स्थान पर रोकना चाहिए। मरम्मत के लिए, आपको यह पता लगाना चाहिए कि कौन सा पैकेज दो बार स्थापित है (ऐसा लगता है कि यह bytestring है) और इसे अनधिकृत करें।

मुझे थोड़ा सा पता चला है कि मुझे यह पता लगाने के लिए कितना काम करना पड़ा: यह अच्छा होगा अगर "फू के लिए कोई उदाहरण नहीं" होगा, भले ही एक अन्य फू के लिए एक उदाहरण हो " ।

I know आपको क्या लगता है।सौभाग्य से यह पहले से ही fixed है, इसलिए आपको ghc-8

+0

बढ़िया! मैं ghc 8 में अपग्रेड करने की आशा करता हूं, जैसे ही मैं ठीक कर दूंगा https://ghc.haskell.org/trac/ghc/ticket/12007 इसे वहां बनाता है। Mysql-simple के साथ-साथ कैबल इंस्टॉलेशन की मांग करना और नए बाइटस्ट्रिंग ने मुझे छेद से बाहर निकाला। मेरे छोटे-छोटे-एक-स्थानीय-विशेष-उद्देश्य कार्यक्रम को कैबलाइज करना काफी ऊपरी जोड़ देगा। – pigworker

संबंधित मुद्दे