私は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 = do
updateDB "Frank Silver" 40
で
'main'の' updateDB'の周りに少なくとも 'runResourceT 'が必要です。私はそれが十分であるかどうかは分かりません。 –
runResourceT $ updateDB "Frank Silver" 40として行を書き直しました!ありがとうございました。あなたは答えとしてあなたのコメントを投稿したいでしょうか? –
私はこの問題を永続的にも使用していましたが、私はMonadLoggerのIO欠落のインスタンスにもエラーがありました。私はそれが他の貧しい人々を助けることを期待してここに残しています。キーは 'runResourceTを使うことです。 Control.Monad.Logger.runNoLoggingT'がMonadLogger IOのインスタンスとして削除されました。 – Khanzor