
On Sat, May 28, 2011 at 4:35 PM, Neil Jensen
I've been attempting to refactor some working code and running into confusion about returning IO values.
The basic sequence is to query a database, calculate some values, and then store the results back in the database.
The function which does the querying of the db and calculating results has the following type signature: calcCUVs :: AccountId -> IO [((ISODateInt, ISODateInt), CUV)]
This function stores the results back into the database saveCUVs :: AccountId -> [((ISODateInt, ISODateInt), CUV)] -> IO () saveCUVs account cuvs = do r' <- mapM (\x -> storeCUV (snd $ fst x) account (snd x)) cuvs return ()
I had a working variation of the below using 'do' notation, but for some reason when I moved to using bind, I'm getting messed up with return values.
processAccountCUVs :: AccountId -> ISODateInt -> ISODateInt -> IO () processAccountCUVs account prevMonthEnd monthEnd = -- do if (prevMonthEnd == 0 && monthEnd == 0) then calcCUVs account >>= (\cuvs -> saveCUVs account cuvs) >>= return () else calcCUVs account prevMonthEnd monthEnd >>= (\cuvs -> saveCUVs account cuvs) >>= return ()
I think you might have your parenthesis in the wrong spot. Instead of
x >>= (\a -> y a) >> z
you probably want:
x >>= (\a -> y a >> z)
Does that make sense? Antoine