我一直在想出一个简单而直观的方式来使用Haskell数据库。我已从Yesod book中获取此代码,并尝试进行清理,以便更易于理解和使用。Haskell/Persistent-Sqlite:“没有(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 }
任何建议指出我在正确的方向将不胜感激。
你至少需要''main'中'updateDB'的'runResourceT'。不过,我不确定这是否足够。 – 2013-02-24 00:01:09
将行重写为runResourceT $ updateDB“Frank Silver”40工作!谢谢。也许你想发表你的评论作为答案? – 2013-02-24 00:07:28
我有这个问题使用持久性,但我也有一个MonadLogger的IO缺失实例的错误。我希望它能帮助其他可怜的灵魂。关键是使用'runResourceT。 Control.Monad.Logger.runNoLoggingT',因为MonadLogger IO的实例已被删除。 – Khanzor 2013-05-28 21:56:06