[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