
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".