[Haskell-beginners] Re: ghci access to .hs functions
prad
prad at towardsfreedom.com
Thu Aug 12 16:18:11 EDT 2010
On Thu, 12 Aug 2010 12:00:44 -0300
MAN <elviotoccalino at gmail.com> wrote:
> 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
More information about the Beginners
mailing list