簡體   English   中英

Haskell / Persistent-Sqlite:“沒有(Control.Monad.Trans.Resource.MonadResource IO)的實例”

[英]Haskell / Persistent-Sqlite: “No instance for (Control.Monad.Trans.Resource.MonadResource IO)”

我一直試圖想出一種簡單直觀的方法來使用Haskell數據庫。 我從Yesod書中獲取了這些代碼並試圖將其清理干凈,以便更容易理解和使用。

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

updateDB "Frank Silver" 40的類型被推斷為IO () ,因為它是main的默認類型(對於某些a它必須具有類型IO a a )。 但是從定義來看,它的類型被推斷為MonadRescource m => ma for some a (可能是a = () ,但我不確定),並且沒有instance MonadResource IO 所以你需要一些東西來將updateDB轉換為IO動作,正常的方法是runResourceT ,它將ResourceT ma轉換為ma (這里是m = IO ),所以

main = runResourceT $ updateDB "Frank Silver" 40

作品。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM