
Based on the earlier posted joke on this list, I put together the following code. Could probably use a bit of simplification, but you get the picture. import IO import GHC.IOBase -- True = nice foot, False = shot up by some lunatic type Foot = Bool -- Manage a request from the user, given request and current foot state manage :: Char -> Foot -> IO Foot manage c foot -- InterleaveIO Makes the request "lazy" | c == '1' = unsafeInterleaveIO $ do putStr "OUCH!!!! Shoot Self in Foot\n" return False -- The foot is now shot -- The doctor examines the state of the foot variable | c == '2' = do putStr "Doctor examines foot\n" if foot then putStr "I have a good foot.\n" else putStr "I have a shot-up foot.\n" return foot -- Otherwise just keep processing | otherwise = do return foot -- Main processing loop process :: Foot -> IO () process f = do c <- getChar -- Get a character putChar '\n' -- Return to keep the screen neat if c == '0' -- Is it an exit? then return () -- then leave else do f' <- manage c f -- otherwise manage request process f' -- continue to process -- Little usage message usage :: IO () usage = do putStr "0. Exit Program\n" putStr "1. Pull Trigger\n" putStr "2. Call Doctor\n" -- Main routine main :: IO () main = do usage -- Print usage process True -- Start processing with a good foot