मैं हास्केल के साथ डेटाबेस का उपयोग करने के लिए एक सरल और सहज तरीके से आने का प्रयास कर रहा हूं। मैंने इस कोड को Yesod book से लिया है और इसे साफ़ करने की कोशिश की है ताकि इसे समझना और उपयोग करना आसान हो।हास्केल/पर्सिस्टेंट-स्क्लाइट: "कोई उदाहरण नहीं है (Control.Monad.Trans.Resource.MonadResource IO)"
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-}
{-# LANGUAGE GADTs, FlexibleContexts #-}
import Database.Persist
import Database.Persist.Sqlite (withSqliteConn, runSqlConn, runMigration)
import Database.Persist.TH (share, mkPersist, mkMigrate, sqlSettings, persist)
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Person -- Table name
name String -- String value
age Int Maybe -- Numerical value
|]
updateDB x y = withSqliteConn "data.db" $ runSqlConn $ do
runMigration migrateAll -- Creates "Person" table if one doesn't exist
insert $ Person x $ Just y -- Inserts values into .db file
main = do
updateDB "Frank Silver" 40 -- adds name "Frank Silver" and age "40" to data.db file
इस कोड लगभग काम करता है, लेकिन मैं निम्न त्रुटि जो मैं हल करने में सक्षम नहीं किया गया मिलता है।
No instance for (Control.Monad.Trans.Resource.MonadResource IO)
arising from a use of `updateDB'
Possible fix:
add an instance declaration for
(Control.Monad.Trans.Resource.MonadResource IO)
In a stmt of a 'do' block: updateDB "Frank Silver" 40
In the expression: do { updateDB "Frank Silver" 40 }
In an equation for `main': main = do { updateDB "Frank Silver" 40 }
सही दिशा में मुझे इंगित करने वाले किसी भी सुझाव की सराहना की जाएगी।
आपको 'मुख्य' में 'updateDB' के आस-पास कम से कम 'runResourceT' की आवश्यकता है। मुझे यकीन नहीं है कि यह पर्याप्त होगा, हालांकि। –
लाइन को पुन: लिखने के रूप में runResourceT $ updateDB "फ्रैंक सिल्वर" 40 काम किया! धन्यवाद। शायद आप अपनी टिप्पणी को उत्तर के रूप में पोस्ट करना चाहते हैं? –
मुझे लगातार इस समस्या का उपयोग करके समस्या थी, लेकिन मुझे आईओ गायब होने के लिए मोनाडलॉगर के उदाहरण के साथ भी एक त्रुटि हुई। मैं इसे आशा में छोड़ रहा हूं कि यह किसी अन्य गरीब आत्मा की मदद करता है। कुंजी 'runResourceT का उपयोग करना है। Control.Monad.Logger.runNoLoggingT', जैसा कि MonadLogger IO के उदाहरण को हटा दिया गया है। – Khanzor