我的 Haskell 技能还处于起步阶段,单子让我很困惑。
但是,我需要构建一个函数,将所有装置安装在 sqlite3 数据库中。
module UmeQuery where
import Database.HDBC
import Database.HDBC.Sqlite3
testdb = "testdata/ume.umedb"
runSetup dbFile = do
conn <- connectSqlite3 dbFile
res <- withTransaction conn ( setup conn )
disconnect conn
return $ res
setup conn = do
n1 <- setupUtterances conn
n2 <- setupLevels conn
return $ [n1, n2]
setupUtterances conn = do
q1 <- quickQuery' conn "DROP TABLE IF EXISTS utterances;" []
q2 <- quickQuery' conn "CREATE TABLE utterances (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, filelength REAL, updated_at TEXT, checksum_algorithm TEXT, checksum TEXT, UNIQUE(name) ON CONFLICT FAIL );" []
return $ [q1,q2]
setupLevels conn = do
q1 <- quickQuery' conn "DROP TABLE IF EXISTS levels;"
q2 <- quickQuery' conn "CREATE TABLE levels (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE ON CONFLICT FAIL );"
return $ [q1,q2]
当我尝试运行它时,我得到以下输出:
UmeQuery.hs:16:15:
Couldn't match expected type `IO [[[SqlValue]]]'
with actual type `[SqlValue] -> [IO [[SqlValue]]]'
In the return type of a call of `setupLevels'
Probable cause: `setupLevels' is applied to too few arguments
In a stmt of a 'do' block: n2 <- setupLevels conn
In the expression:
do { n1 <- setupUtterances conn;
n2 <- setupLevels conn;
return $ [n1, n2] }
我想得到的只是表明一切都很好的东西。请注意,我似乎需要严格,否则在创建新表之前并不总是超过“DROP TABLE”语句。
另外,如果我可以一次问两个问题: setup 最终将以类似的方式设置 12 个表。在这种情况下,有什么方法可以在包含所涉及函数的列表上将 setup 构造为 ($ conn) 的 fmap?当然,这会使代码变得更好。