[Haskell-cafe] Database relations mapping

Jonathan Cast jonathanccast at fastmail.fm
Sat Feb 23 10:45:20 EST 2008


On 23 Feb 2008, at 3:30 AM, Radosław Grzanka wrote:

> Hi,
>   I'm developing toy application to learn HDBC. I have "problem" with
> doing relations mapping. Actually I don't know is it a problem or
> "feature". ;)
>
> Anyway, I have two tables with relation between them:
>
> (this example is simplified to the whole structure of database, you  
> can imagine)
>
> CREATE TABLE TD_set (
>          setId INTEGER PRIMARY KEY,
>          setName TEXT NOT NULL
>          )
>
> CREATE TABLE TO_card (
>          cardId INTEGER PRIMARY KEY AUTOINCREMENT,
>          setId INTEGER NOT NULL,"                       -- Relation  
> to TD_set
>          setSeq INTEGER NOT NULL
>          )
>
> (no foreign key as sqlite3 does not care anyway - at least AFAIK)
>
> And in Haskell:
>
>> type CardSet = String
>>
>> data Card = Card {
>>    set             :: CardSet,
>>    seqNo        :: Integer,
>> }
>
> There is no problem with filling the structure Card with "seqNo" but I
> can't fill "set". I would have to put there IO (CardSet) but I don't
> want to do that as whole structure returned from my mapping function
> is already inside IO monad. Can I do it?

> Here is my (perfect) function - http://hpaste.org/5839 . See
> "getCards" and some helper functions. This does not compile as (I
> believe) getElement wants to return IO (CardSet)
>
> Thank you in advance for all your input.

You want to put toItem into the IO monad:

toItem [cardId, setId, setSeq] = do
   set_ <- getElement
   return $ Card {
     set          = set_
     seqNo        = fromSql setSeq,
     }
toItem x = fail ("Unexpected result in getCards: " ++ (show x))

Then use

mapM toItem cards

instead of

return $ map toItem cards

jcc



More information about the Haskell-Cafe mailing list