
On Thu, 12 Aug 2010 12:00:44 -0300
MAN
couple of things you could be interested to know.
most definitely! i very much appreciate the help, el. thx to you too brent for clearing up the ExitCode problem
Your main will allways be 'IO ()' , but that doesn't mean you must sparkle 'return ()' all over the place :P
well i have been specializing in random programming => just keep trying things randomly and hope it works. :D putting return() in the "all" worked (no idea why), so i thought it must be a good thing and put it in the other two. :D i'd also used mapM because map didn't work and i figured it had something to do with monads and M is the first letter in monad. :D i really have to get away from this sort of thing and i'm trying to figure out the excellent stuff etugrul and kyle provided in the = vs <- thread. now i tried taking the returns out and things are fine for "add" and "upd", but even with the changes you suggested for gtKys (mapM to mapM_) i'm getting these errors: ====== gadit.hs:30:19: Couldn't match expected type `()' against inferred type `[()]' Expected type: IO () Inferred type: IO [()] In the expression: gtKys conn In a case alternative: "all" -> gtKys conn gadit.hs:66:4: Couldn't match expected type `[()]' against inferred type `()' Expected type: IO [()] Inferred type: IO () In the expression: mapM_ (mkPag conn) kL In the expression: do { r <- quickQuery conn "SELECT key from main" []; let kL = concat $ map (map fromSql) r; mapM_ (mkPag conn) kL } ======= it want some sort of list and i'm not providing it. here is the code in question with the line numbers: ======= 21 main = do 22 args <- getArgs 23 let act = head args 24 conn <- connectPostgreSQL "host=localhost dbname=lohv user=pradmin" 25 case act of 26 "add" -> do 27 kV1 <- dbDef conn 28 upDbs conn (fromSql kV1) 29 "upd" -> upDbs conn (last args) 30 "all" -> gtKys conn 31 _ -> putStrLn "add, upd num, all only!!" 32 commit conn 33 disconnect conn 34 putStrLn "All Done!" ... 61 -- gtKys: gets all key values in database 62 gtKys :: (IConnection conn) => conn -> IO [()] 63 gtKys conn = do 64 r <- quickQuery conn "SELECT key from main" [] 65 let kL = concat $ map (map fromSql) r 66 mapM_ (mkPag conn) kL ======== now i got to thinking about all this and realized that gtKys really shouldn't have mapM_ (mkPag conn) kL in there anyway because its job is to just get some key values not to make Pages (mkPag) in fact, i only put it in there because i couldn't figure out how to get the stuff out - as kyle says in the other thread: "once something is "inside" of a monad (IO in this case), it's very difficult, impossible, to get it out again." so what i did is rewrite the code like this: case act of ... "all" -> do kyL <- gtKys conn mapM_ (mkPag conn) kyL and gtKys conn = do r <- quickQuery conn "SELECT key from main" [] return $ concat $ map (map fromSql) r it all works now. gtKys now has the lengthy type: gtKys :: (IConnection conn, Data.Convertible.Base.Convertible SqlValue a) => conn -> IO [a] which i'm leaving out since it generates a scope error unless i import something else (as brent explained in the above post regarding ExitCode). however, i still don't quite understand what the return is doing beyond you seem to need it in order to get things out of a monad associated function. whenever i have an IO () i seem to require it. there seem to be several ways to ask functions to provide computations and require specific ways to get access to them. -- In friendship, prad ... with you on your journey Towards Freedom http://www.towardsfreedom.com (website) Information, Inspiration, Imagination - truly a site for soaring I's