2013-12-11 206 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