2013-12-11 122 views
0

我有一般可以插入数据的代码。我有一个记录列表在数据库中插入记录Haskell

let s = [HrefInfo {link =“introduction”,description =“Introduction”},HrefInfo {link =“introduction#about-this-tutorial”,description =“关于本教程“}]

现在我想在一个数据库中插入记录,其中链接将在一列中,描述将在另一列中。

module Main(main) where 

import Database.HDBC.Sqlite3 
import Database.HDBC 
import Database.HDBC.Types 
import Database.HDBC.SqlValue 
import Data.Convertible.Base 

type Link = [Char] 
type Description = String 
type HrefLinktDes = [HrefInfo] 

data HrefInfo = HrefInfo { link :: Link 
        , description :: Description 
        } deriving (Eq, Show, Read) 

createDB :: IO() 
createDB = do {conn <- connectSqlite3 "ld.db"; 
       run conn "CREATE TABLE ld (url TEXT, des TEXT)" []; 
       commit conn;} 

storeMany :: [[String]] -> IO() 
storeMany xs = 
     do conn <- connectSqlite3 "ld.db" 
     stmt <- prepare conn "INSERT INTO ld (url, des) VALUES (?,?)" 
     executeMany stmt $ map (map toSql) xs 
     commit conn 

main = do storeMany [["a","b"],["c","d"],["e","f"]] 

当我试图打破记录它给了我错误。谁能帮帮我吗。谢谢。

+2

是什么错误消息? – bheklilr

+0

问题是类型不一样storeMany应该像storeMany :: HrefLinktDes - > IO()...但我不能正确使用'map'。 – Nusrat

+1

你应该把它放在你的问题中,从代码中不清楚你的问题是将'HrefLinktDes'转换为'[String]'。您还应该显示“HrefLinktDes”数据类型的声明。 – bheklilr

回答

1

在回答您的comment

什么你想要做的就是你的HrefLinktDes名单将它传递给storeMany之前转换为[[String]]。你可以很容易地做到这一点:

hrefToList :: HrefLinktDes -> [String] 
hrefToList href = [link href, description href] 

所有你正在做的是按特定的顺序将每条信息提取到列表中。您也可以使用模式匹配或RecordWildcards扩展名来做到这一点,但是这个扩展很简单。然后,只需

main = storeMany $ map hrefToList s 
    where 
     s = [HrefInfo {link = "introduction", 
         description = "Introduction"}, 
      HrefInfo {link = "introduction#about-this-tutorial", 
         description = "About this tutorial"} 
      ] 

或者,你可以写一个函数storeHrefs

storeHrefs :: [HrefInfo] -> IO() 
storeHrefs hrefs = do 
    conn <- connectSqlite3 "ld.db" 
    stmt <- prepare conn "INSERT INTO ld (url, des) VALUES (?,?)" 
    execMany stmt $ map (map toSql . hrefToList) hrefs 
    commit conn 

main = storeHrefs hrefs 
    where 
     hrefs = ... 

(这应该编译,但我没有检查,因为我没有安装HDBC做)

+0

我认为,hrefToList :: HrefLinktDes - > [String]存在问题,它应该返回[[String]]。 hrefToList :: HrefInfo - > [String] hrefToList href = [link href,description href] 以上就是一条记录的好处 – Nusrat

+1

这就是为什么我在's'上使用'map hrefToList'的原因。 'map hrefToList :: [HrefLinktDes] - > [[String]]',但是'hrefToList :: HrefLinktDes - > [String]'。该代码旨在一次仅处理一个代码,通常以这种方式编写代码是一种很好的做法,其中有一个函数可以转换单个元素,然后使用map来转换元素列表。 – bheklilr

+0

hrefToList :: HrefLinktDes - > [[String]] hrefToList(x:xs)= [link x,description x]:hrefToList xs hrefToList [] = [] ...我稍微改变...无论如何想法作品 – Nusrat