sub*_*ray 8 database haskell yesod
我一直试图想出一种简单直观的方法来使用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
Run Code Online (Sandbox Code Playgroud)
这段代码几乎可以工作,但我得到以下错误,我无法解决.
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 }
Run Code Online (Sandbox Code Playgroud)
任何建议指向我正确的方向将不胜感激.
同
main = do
updateDB "Frank Silver" 40
Run Code Online (Sandbox Code Playgroud)
updateDB "Frank Silver" 40推断的类型是IO (),因为它是默认类型main(它必须具有IO a某些类型a).但是根据定义,它的类型被推断MonadRescource m => m a为某些a(可能a = (),但我不确定),并且没有instance MonadResource IO.所以你需要一些东西来转换updateDB成一个IO动作,正常的方法就是runResourceT把它ResourceT m a变成一个m a(这里m = IO),所以
main = runResourceT $ updateDB "Frank Silver" 40
Run Code Online (Sandbox Code Playgroud)
作品.
| 归档时间: |
|
| 查看次数: |
1060 次 |
| 最近记录: |