-- This leaks with GHC 7.8.3 -O2, strict field notwithstanding. duration = 5000000 -- XXX tune for your hardware period = duration `div` 10 data State = St !Bool toggle (St b) = St (not b) main = do putStrLn "Leaky started." rslt <- duty (St False) 0 (return $! rslt) >>= return putStrLn "Finished." duty :: State -> Int -> IO State duty state i = do let state' = toggle state if 0 == i `mod` period then return () else return () if i < duration then duty state' (1+i) else return state'