因此,我试图在Haskell中编写数据库层,以与SQLite DB交互。在有关数据库的章节中,我正在遵循《真实世界Haskell》一书中的说明。这是我到目前为止的内容:
{-# LANGUAGE FlexibleContexts #-}
import Database.HDBC
import Database.HDBC.Sqlite3
db = "dev.db"
conn = connectSqlite3 db
getPerson person =
quickQuery' conn "select name from person where name like ?" [toSql person]
main :: IO ()
main = do
print $ getPerson "Michael"
但是我得到了错误:
Could not deduce (IConnection (IO Connection))
arising from a use of ‘quickQuery'’
from the context: convertible-1.1.1.0:Data.Convertible.Base.Convertible
a SqlValue
bound by the inferred type of
getPerson :: convertible-1.1.1.0:Data.Convertible.Base.Convertible
a SqlValue =>
a -> IO [[SqlValue]]
作为Haskell初学者,我不太了解。我可以在getPerson上放置类型注释,但这似乎并不能解决。
最佳答案
此代码已编译
{-# LANGUAGE FlexibleContexts #-}
import Database.HDBC
import Database.HDBC.Sqlite3
import Data.Convertible.Base
db :: String
db = "dev.db"
getPerson :: (Convertible a SqlValue, IConnection conn) => conn -> a -> IO [[SqlValue]]
getPerson conn person =
quickQuery' conn "select name from person where name like ?" [toSql person]
main :: IO ()
main = do
conn <- connectSqlite3 db
person <- getPerson conn "Michael"
print person
connectSqlite3 :: FilePath -> IO Connection
,因此应在conn
中提取IO monad
的值。也许有更好的方法使用
bind
将此连接传递给quickQuery
,但是我不知道,我从未使用过此库,只是从ghci
中的类型猜测
关于sqlite - 如何编写Haskell函数来查询数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47448544/