Hi,

I have a set of functions:

f1 :: DBRecord -> Maybe Int
f2 :: Int -> IO Maybe DBRecord
f3 :: DBRecord -> Maybe Int

The odd numbered functions are field accessors, accessing a field that might hold an identifier for another record. The even numbered functions are record fetch functions that get records from the database. I want to compose these so that I can navigate structures of joined records in the database.

How can I concisely compose these functions without having to write a cascade of case statements such as:

case f1 rec1 of
    Nothing -> return Nothing
    Just id1 -> do
                    rec2 <- f2 id2
                    return $ case rec2 of
                                Nothing -> return Nothing
                                Just rec2' -> case f3 rec2' of
                                                ....
I understand that if I was just dealing with Maybe I could use the fact that Maybe is a monad. I am also not sure if composing the IO and the Maybe will get me what I want (some of the functions only return Maybe Int).

Cheers

Mark

PS Heard this on the 'West Wing' and thought it was appropriate in a way:

A coach goes up to a player and asks "Are you ignorant or apathetic?". The player replies "I don't know and I don't care".
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to