0

我正在尝试使用 Database.HDBC 和 Database.HDBC.Sqlite3。

要将表添加到 SQLite3 数据库,这是我在 GHCI 中输入的命令类型:

run conn "CREATE TABLE table1 (a INTEGER)" []

我现在想使用字符串列表从我的程序中将表名添加到数据库中。

这是我正在使用的变量:

tables = ["CREATE TABLE t1 (a INTEGER)","CREATE TABLE t2 (a INTEGER)",..]

表被传递给我创建的名为 addTables 的函数:

addTables xs = [ run conn x [] | x <- xs ]

但我的 addTables 函数返回此错误:

<interactive>:199:1:
    No instance for (Show (IO Integer))
      arising from a use of `print'
    Possible fix: add an instance declaration for (Show (IO Integer))
    In a stmt of an interactive GHCi command: print it

我怀疑 Haskell 不喜欢不打印任何内容的列表推导?

任何帮助或建议将不胜感激。

4

1 回答 1

2

不,问题是IO无法打印动作。看,你只是构建了一个动作列表,而不是运行它们。

试试这个:

addTables xs = sequence [run conn x [] | x <- xs]

或者,等效地:

addTables xs = mapM (\x -> run conn x []) xs

如果您不关心结果,mapM_则效率稍高。

于 2012-11-20T17:26:15.000 回答