[Haskell-beginners] Nested Iterations with Takusen
Pepe Barbe
elventear at gmail.com
Mon Apr 18 16:46:04 CEST 2011
Hello everyone,
I am new to Haskell and I am trying to use the Takusen library to query an SQL database. My desire is two perform a two level query query where the first query will iterate through some values that will be used in the second level to get the data of interest.
I am having issues with the types and I haven't been able to figure out what am I doing wrong. Below is some sample code that shows the problem I am dealing with:
-- sample.hs
import Database.PostgreSQL.Enumerator
import Database.Enumerator
db_host = CAhost "host"
db_user = CAuser "user"
db_password = CApassword "pass"
db_name = CAdbname "name"
db_auth_tokens = [db_user, db_password, db_host, db_name]
connection = connect db_auth_tokens
secondLevelQuery :: IO Integer
secondLevelQuery = do
let query = sql "SELECT count(*) from alarms"
iter :: Monad m => Integer -> IterAct m Integer
iter count _ = result' count
withSession connection (doQuery query iter 0)
firstLevelQuery :: IO (Integer, Integer)
firstLevelQuery = do
let query = sql "SELECT count(*) from alarms"
iter :: Monad m => Integer -> IterAct m (Integer, Integer)
iter count _ = do
count' <- secondLevelQuery
result' (count', count)
withSession connection (doQuery query iter (0,0))
main = firstLevelQuery
-- end sample.hs
And the output from ghc is:
sample.hs:23:31:
Could not deduce (m ~ IO)
from the context (Monad m)
bound by the type signature for
iter :: Monad m => Integer -> IterAct m (Integer, Integer)
at sample.hs:(22,7)-(24,43)
`m' is a rigid type variable bound by
the type signature for
iter :: Monad m => Integer -> IterAct m (Integer, Integer)
at sample.hs:22:7
Expected type: m Integer
Actual type: IO Integer
In a stmt of a 'do' expression: count' <- secondLevelQuery
In the expression:
do { count' <- secondLevelQuery;
result' (count', count) }
In an equation for `iter':
iter count _
= do { count' <- secondLevelQuery;
result' (count', count) }
I would appreciate any help in figuring out what am I doing wrong.
Thanks,
Pepe
More information about the Beginners
mailing list