Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://www.haskell.org/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: matrix vector product (Brent Yorgey)
2. sqlite+json: code improvement request (jjinkou syoujyo)
----------------------------------------------------------------------
Message: 1
Date: Mon, 12 Sep 2011 08:08:50 -0400
From: Brent Yorgey <[email protected]>
Subject: Re: [Haskell-beginners] matrix vector product
To: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset=us-ascii
On Sun, Sep 11, 2011 at 09:30:00PM -0600, kolli kolli wrote:
> Hi,
> Can anyone help me with the matrix vector product?
You will have to be much more specific. What exactly do you need help
with?
-Brent
------------------------------
Message: 2
Date: Mon, 12 Sep 2011 16:52:17 +0100 (BST)
From: jjinkou syoujyo <[email protected]>
Subject: [Haskell-beginners] sqlite+json: code improvement request
To: "[email protected]" <[email protected]>
Message-ID:
<[email protected]>
Content-Type: text/plain; charset="iso-8859-1"
Hello,
i'm trying to implement this code which works but? I would like to have advices
to refactor this code to be more functionnal.
This code receives an http request such as get?tab=urds,json={...}, converts
the string json to a json structure. Then it translates it to an sqlite3
requests and sends back a json structure.
since i will have several tables (urds, labos ... an so on ) i don't believe
this code is optimal. there's a bunch of "case ..." that i really dislike.
Though i know that i may try use ReadT monad, i don't really know how to use it
with HDBCerrorhandler.
here is the code:
thank you for your help.
================
import Network.CGI
import Database.HDBC
import Database.HDBC.Sqlite3
import Data.Maybe (fromJust)
import Library
import Text.JSON
import Control.Applicative
data UrdTyp = UrdVal {
??????? urdID::String,
??????? urd::String,
??????? urdlaboID::String
} deriving (Eq,Show)
data LaboTyp = LaboVal {
??????? laboID::String,
??????? labo::String
} deriving (Eq,Show)???????
instance JSON UrdTyp where
??? showJSON urds = makeObj
??????????????????? [("urdID", showJSON $ urdID urds)
??????????????????? ,("urd", showJSON $ urd urds)
??????????????????? ,("laboID", showJSON $ urdlaboID urds)]
??? readJSON urds = do obj <- readJSON urds
?????????????????????? UrdVal? <$> valFromObj "urdID" obj
?????????????????????????????? <*> valFromObj "urd" obj
?????????????????????????????? <*> valFromObj "laboID" obj
??????????????????????????????
instance JSON LaboTyp where
??? showJSON labos = makeObj
??????????????????? [("laboID", showJSON $ laboID labos)
??????????????????? ,("labo", showJSON $ labo labos)]
??? readJSON labos = do obj <- readJSON labos
??????????????????????? LaboVal <$> valFromObj "laboID" obj
??????????????????????????????? <*> valFromObj "labo" obj
??????????????????????????????
??????????????????????????????
sql2UrdVal::[(String,SqlValue)]->Maybe UrdTyp
sql2UrdVal? =? toUrdVal . map (\(x,y)-> (x,fromSql y::String))
??? where
??????? toUrdVal obj= UrdVal <$> lookup "UrdID" obj
???????????????????????????? <*> lookup "Urd" obj
???????????????????????????? <*> lookup "LaboID" obj
sql2LaboVal::[(String,SqlValue)]->Maybe LaboTyp
sql2LaboVal? =? toLaboVal . map (\(x,y)-> (x,fromSql y::String))
??? where
??????? toLaboVal obj= LaboVal <$> lookup "LaboID" obj
?????????????????????????????? <*> lookup "Labo" obj
sqlReadAll? ::? String ->IO [[(String,SqlValue)]]
sqlReadAll table = do
??? handle????? <- connectSqlite3 "fm.db"
??? stmt??????? <-? prepare handle $ "SELECT * FROM " ++ table
??? execute stmt []
??? entryRows???? <- fetchAllRowsAL' stmt
??? disconnect handle
??? return entryRows
???
sqlReadOne:: String -> String -> Int -> IO [[(String,SqlValue)]]
sqlReadOne table column eid = do?
??? handle <- connectSqlite3 "fm.db"
??? stmt <-? prepare handle $ "SELECT * FROM "
??????????????????????????? ++ table ++ " where "
??????????????????????????? ++ column ++" = ?"
??? execute stmt [toSql eid]
??? entryRows <- fetchAllRowsAL' stmt
??? disconnect handle
??? return entryRows
queryAll::? CGI CGIResult
queryAll = do
??? Just table?????? <- getInput "tab"
??? entryRows <- liftIO $sqlReadAll table
??? case table of
?????? "urds" -> do
???????????????? let sqlUrds = map sql2UrdVal entryRows
???????????????? let listUrds=map (encode.showJSON.fromJust) sqlUrds
???????????????? let toStr=foldr (\a b -> a++","++b) [] listUrds
???????????????? setHeader "Content-type" "application/x-javascript"
???????????????? output $ "{\"list\":"
?????????????????????????? ++ "[" ++ toStr ++ "]"
?????????????????????????? ++ "}"
?????? "labos" -> do
???????????????? let sqlLabos = map sql2LaboVal entryRows
???????????????? let listLabos=map (encode.showJSON.fromJust) sqlLabos
???????????????? let toStr=foldr (\a b -> a++","++b) [] listLabos
???????????????? setHeader "Content-type" "application/x-javascript"
???????????????? output $ "{\"list\":"
?????????????????????????? ++ "[" ++ toStr ++ "]"
?????????????????????????? ++ "}"
queryOne:: CGI CGIResult
queryOne = do
??? jsonString <- getInput "json"
??? Just table????? <- getInput "tab"
??? case table of
?????? "urds" -> do
???????????? let (Ok j) = (decode.fromJust) jsonString::Result UrdTyp
???????????? let idjson = (read.urdID) j ::Int
???????????? entryRows <- liftIO $sqlReadOne "urds" "urdID" idjson
???????????? let sqlUrds = map sql2UrdVal entryRows
???????????? let val=head.map (encode.showJSON.fromJust) $sqlUrds
???????????? setHeader "Content-type" "application/x-javascript"
???????????? output? $"{\"data\":"++ val ++"}"
?????? "labos" -> do
???????????? let (Ok j) = (decode.fromJust) jsonString::Result LaboTyp
???????????? let idjson = (read.laboID) j ::Int
???????????? entryRows <- liftIO $sqlReadOne "labos" "laboID" idjson
???????????? let sqlLabos = map sql2LaboVal entryRows
???????????? let val=head.map (encode.showJSON.fromJust) $sqlLabos
???????????? setHeader "Content-type" "application/x-javascript"
???????????? output? $"{\"data\":"++ val ++"}"
addEntrySql :: CGI CGIResult
addEntrySql = do
??? jsonString<- getInput "json"
??? Just table????? <- getInput "tab"
??? case table of
?????? "urds" -> do
??????????????? let (Ok j) = (decode.fromJust) jsonString::Result UrdTyp
??????????????? dbh <- liftIO $ connectSqlite3 "fm.db"
??????????????? adEJson <-liftIO $ addUrd dbh j
??????????????? liftIO $ commit dbh
??????????????? liftIO $ disconnect dbh
??????????????? setHeader "Content-type" "application/x-javascript"
??????????????? output $ "{\"entry\": " ++ "\"added\""
????????????????????????? ++",\n\"data\": "++ encode adEJson ++"}"
?????? "labos" -> do
??????????????? let (Ok j) = (decode.fromJust) jsonString::Result LaboTyp
??????????????? dbh <- liftIO $ connectSqlite3 "fm.db"
??????????????? adEJson <-liftIO $ addLabo dbh j
??????????????? liftIO $ commit dbh
??????????????? liftIO $ disconnect dbh
??????????????? setHeader "Content-type" "application/x-javascript"
??????????????? output $ "{\"entry\": " ++ "\"added\""
????????????????????????? ++",\n\"data\": " ++ encode adEJson ++"}"
addUrd :: (IConnection conn) => conn -> UrdTyp -> IO UrdTyp
addUrd dbh urdJs =
??? handleSql errorHandler $
??????? do
??????????? run dbh "insert into urds (urd,LaboID) values (?,?)" $
??????????????????? map toSql [urd urdJs, urdlaboID urdJs]
??????????? r <- quickQuery' dbh "select urdID from urds where urd=?"
??????????????????? [toSql (urd urdJs)]
??????????? case r of
??????????????? [[x]] -> return urdJs {urdID= fromSql x}
??????????????? y -> fail $ "addentry: unexpected result: " ++ show y
??????? where errorHandler e =
??????????????? do fail $ "problem addentry: "++ show e
addLabo :: (IConnection conn) => conn -> LaboTyp -> IO LaboTyp
addLabo dbh laboJs =
??? handleSql errorHandler $
??????? do
??????????? run dbh "insert into labos (labo) values (?)" $
??????????????????? map toSql [labo laboJs]
??????????? r <- quickQuery' dbh "select laboID from labos where labo=?"
??????????????????? [toSql (labo laboJs)]
??????????? case r of
??????????????? [[x]] -> return laboJs {laboID= fromSql x}
??????????????? y -> fail $ "addentry: unexpected result: " ++ show y
??????? where errorHandler e =
??????????????? do fail $ "problem addentry: "++ show e
updateEntrySql :: CGI CGIResult
updateEntrySql = do
??? jsonString<- getInput "json"
??? Just table????? <- getInput "tab"
??? case table of
?????? "urds" -> do
??????????????? let (Ok j) = (decode.fromJust) jsonString::Result UrdTyp
??????????????? let entryId = urdID j
??????????????? dbh <- liftIO $ connectSqlite3 "fm.db"
??????????????? liftIO $ updateUrd dbh j entryId
??????????????? liftIO $ commit dbh
??????????????? liftIO $ disconnect dbh
??????????????? setHeader "Content-type" "application/x-javascript"
??????????????? output $ "{\"entry\": " ++ "\"modified\"" ++"}"
?????? "labos" -> do
??????????????? let (Ok j) = (decode.fromJust) jsonString::Result LaboTyp
??????????????? let entryId = laboID j
??????????????? dbh <- liftIO $ connectSqlite3 "fm.db"
??????????????? liftIO $ updateLabo dbh j entryId
??????????????? liftIO $ commit dbh
??????????????? liftIO $ disconnect dbh
??????????????? setHeader "Content-type" "application/x-javascript"
??????????????? output $ "{\"entry\": " ++ "\"modified\"" ++"}"
updateUrd :: (IConnection conn) => conn -> UrdTyp -> String? -> IO ()
updateUrd dbh urdJs entryId =
??? handleSql errorHandler $
??? do
??????? r <- quickQuery' dbh "select urdID from urds where urdID=?"
???????????? [toSql entryId]
??????? case r of
???????????? [[x]] -> run dbh "UPDATE urds SET urd=?, laboID=? WHERE urdID=?"
?????????????????????? (map toSql [urd urdJs, urdlaboID urdJs, entryId])
????????????????????? >> return ()
???????????? y -> fail $ "updateUrd: no such urdID : " ++ show y
??? where errorHandler e =
??????????? do fail $ "problem updateUrd: "++ show e
updateLabo :: (IConnection conn) => conn -> LaboTyp -> String? -> IO ()
updateLabo dbh laboJs entryId =
??? handleSql errorHandler $
??? do
??????? r <- quickQuery' dbh "select laboID from labos where laboID=?"
???????????? [toSql entryId]
??????? case r of
???????????? [[x]] -> run dbh "UPDATE labos SET labo=? WHERE laboID=?"
?????????????????????? (map toSql [labo laboJs, entryId])
????????????????????? >> return ()
???????????? y -> fail $ "updateLabo: no such laboID : " ++ show y
??? where errorHandler e =
??????????? do fail $ "problem updatelabo: "++ show e
removeEntrySql :: CGI CGIResult
removeEntrySql = do
??? jsonString<- getInput "json"
??? Just table????? <- getInput "tab"
??? case table of
?????? "urds" -> do
??????????????? let (Ok j) = (decode.fromJust) jsonString::Result UrdTyp
??????????????? dbh <- liftIO $ connectSqlite3 "fm.db"
??????????????? liftIO $ removeUrd dbh? (read(urdID j)::Int)
??????????????? liftIO $ commit dbh
??????????????? liftIO $ disconnect dbh
??????????????? setHeader "Content-type" "application/x-javascript"
??????????????? output $ "{\"entry\": " ++ "\"deleted\""
????????????????????????? ++",\n\"EntryId\": "++ show (urdID j)
????????????????????????? ++"}"
?????? "labos" -> do
??????????????? let (Ok j) = (decode.fromJust) jsonString::Result LaboTyp
??????????????? dbh <- liftIO $ connectSqlite3 "fm.db"
??????????????? liftIO $ removeLabo dbh? (read(laboID j)::Int)
??????????????? liftIO $ commit dbh
??????????????? liftIO $ disconnect dbh
??????????????? setHeader "Content-type" "application/x-javascript"
??????????????? output $ "{\"entry\": " ++ "\"deleted\""
????????????????????????? ++",\n\"EntryId\": "++ show (laboID j)
????????????????????????? ++"}"
removeUrd :: (IConnection conn) => conn -> Int -> IO ()
removeUrd dbh entryId =
??? handleSql errorHandler $
??? do
??????? r <- quickQuery' dbh "select urdID from urds where urdID=?"
???????????? [toSql entryId]
??????? case r of
???????????? [[x]] -> run dbh "DELETE FROM urds WHERE urdID=?"
??????????????????????? [toSql (entryId)]
????????????????????? >> return ()
???????????? y -> fail $ "removeUrd: no such urdID : " ++ show y
??? where errorHandler e =
??????????? do fail $ "problem removeUrd: "++ show e
removeLabo :: (IConnection conn) => conn -> Int -> IO ()
removeLabo dbh entryId =
??? handleSql errorHandler $
??? do
??????? r <- quickQuery' dbh "select LaboID from labos where laboID=?"
???????????? [toSql entryId]
??????? case r of
???????????? [[x]] -> run dbh "DELETE FROM labos WHERE laboID=?"
??????????????????????? [toSql (entryId)]
????????????????????? >> return ()
???????????? y -> fail $ "removeLabo: no such laboID : " ++ show y
??? where errorHandler e =
??????????? do fail $ "problem removeLabo: "++ show e
queryCommand :: CGI CGIResult???????????
queryCommand = do
??? commandString <- getInput "command"
??? case (fromJust commandString) of
??????? "Get"??? -> queryOne
??????? "GetAll"??? -> queryAll
??????? "AddEntry" -> addEntrySql
??????? "Modify" -> updateEntrySql
??????? "Remove" -> removeEntrySql
??????? _??????? -> do
??????????????????????? setHeader "Content-type" "application/x-javascript"
??????????????????????? output $ "{\"command\":\"rien compris du tout\"}"
main = runCGI (handleErrors? queryCommand )
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://www.haskell.org/pipermail/beginners/attachments/20110912/e5350a41/attachment.htm>
------------------------------
_______________________________________________
Beginners mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/beginners
End of Beginners Digest, Vol 39, Issue 14
*****************************************