Hello, beginner here, looking for some ideas on how to simplify how I use the Takusen database library to query a database and return types.

In the working code below, I'm able to query the database and through several functions get a list of simple types. I've tried playing around with the query2Iteratee and getAccounts' functions to simplify the code and reduce it to a single function, but keep getting hung up on compiler errors due to type issues.

Is there a better way to write this, or is it best to keep the various functions quite separate? (in my real project, I have the database access in a separate module from the list of custom types and the code to convert to the Account type).

Thanks in advance,
Neil

import Database.Sqlite.Enumerator
import Database.Enumerator

data Account = Account {account_id :: Int}
            deriving (Eq, Show)


query2Iteratee :: (Monad m) => Int -> [Int] -> m (IterResult [Int])
--query2Iteratee :: (Monad m) => Int -> IterAct m [Int]
query2Iteratee a accum = result' (a:accum)


getAccounts' :: IO [Int]
getAccounts' = do
           let dbh = connect
"performance_data.sqlite"
           withSession dbh (do
                  r <- doQuery (sql "SELECT account_id FROM
ACCOUNT;") query2Iteratee []
                  return r
            )


getAccounts :: IO [Account]
getAccounts  = do
              accountsList <- getAccounts'
              let r = map conv accountsList
              return r

conv :: Int -> Account
conv a = Account {account_id=a}


main = do
    accounts <- getAccounts'
    putStrLn (show accounts)